failomaton
Différences
Ci-dessous, les différences entre deux révisions de la page.
Les deux révisions précédentesRévision précédenteProchaine révision | Révision précédente | ||
failomaton [2023/11/20 17:49] – [Failomaton] Mushussu | failomaton [2024/05/18 13:09] (Version actuelle) – [Caméra] Mushussu | ||
---|---|---|---|
Ligne 3: | Ligne 3: | ||
{{ : | {{ : | ||
+ | |||
+ | |||
+ | ==== A faire ==== | ||
+ | * Un bouton de redémarrage du programme | ||
+ | * La gestion du manque de papier | ||
+ | * Monnayeur | ||
+ | ===== Conception du distributeur de photos ===== | ||
+ | {{: | ||
+ | |||
+ | <code cpp> | ||
+ | |||
+ | $fn = 200; | ||
+ | |||
+ | // Épaisseur CP 10mm | ||
+ | |||
+ | cote(); | ||
+ | translate([350, | ||
+ | translate([290, | ||
+ | |||
+ | translate([305, | ||
+ | translate([330, | ||
+ | |||
+ | translate([15, | ||
+ | translate([123, | ||
+ | |||
+ | // Épaisseur CP 15mm | ||
+ | |||
+ | translate([-120, | ||
+ | translate([-10, | ||
+ | |||
+ | translate([-260, | ||
+ | translate([-30, | ||
+ | |||
+ | module cote() { | ||
+ | difference() { | ||
+ | union() { | ||
+ | square([290, | ||
+ | translate([90, | ||
+ | } | ||
+ | square([55, 6]); // Encoche rabat | ||
+ | translate([290, | ||
+ | translate([0, | ||
+ | translate([265, | ||
+ | translate([0, | ||
+ | // Encoches glissieres | ||
+ | translate([290, | ||
+ | translate([290, | ||
+ | } | ||
+ | } | ||
+ | |||
+ | module support() { | ||
+ | difference() { | ||
+ | square([236, | ||
+ | translate([49.9, | ||
+ | translate([175.9, | ||
+ | translate([16.9, | ||
+ | translate([202.9, | ||
+ | } | ||
+ | } | ||
+ | |||
+ | module glissiere() { | ||
+ | difference() { | ||
+ | square([331.6, | ||
+ | square([60.1, | ||
+ | translate([109.9, | ||
+ | translate([209.9, | ||
+ | } | ||
+ | } | ||
+ | |||
+ | module trapeze() { | ||
+ | difference() { | ||
+ | square([135 * cos(30) + 40, 135 * sin(30)]); | ||
+ | rotate(30) square([200, | ||
+ | translate([0, | ||
+ | translate([0, | ||
+ | translate([0, | ||
+ | translate([0, | ||
+ | } | ||
+ | } | ||
+ | difference() { | ||
+ | rotate(30) translate([-20, | ||
+ | translate([0, | ||
+ | } | ||
+ | translate([135 * cos(30) + 39.9,0]) square([0.1, | ||
+ | } | ||
+ | |||
+ | module ecarteur() { | ||
+ | difference() { | ||
+ | rotate(30) translate([-20, | ||
+ | translate([0, | ||
+ | } | ||
+ | } | ||
+ | |||
+ | module renfort1() { | ||
+ | difference() { | ||
+ | square([49.9, | ||
+ | translate([-15, | ||
+ | } | ||
+ | translate([17, | ||
+ | } | ||
+ | </ | ||
===== Installation de ImageMagick ===== | ===== Installation de ImageMagick ===== | ||
Installation du paquet | Installation du paquet | ||
Ligne 75: | Ligne 176: | ||
Éditer le fichier de configuration de CUPS : | Éditer le fichier de configuration de CUPS : | ||
sudo nano / | sudo nano / | ||
+ | Ajouter les ligne. suivantes au début du fichier : | ||
+ | # Efface l' | ||
+ | PreserveJobHistory No | ||
Modifier la section suivante : | Modifier la section suivante : | ||
# Only listen for connections from the local machine. | # Only listen for connections from the local machine. | ||
Ligne 158: | Ligne 262: | ||
Pour imprimer une photo | Pour imprimer une photo | ||
lp -d Canon_SELPHY_CP1300 photo1.jpg | lp -d Canon_SELPHY_CP1300 photo1.jpg | ||
+ | ===== Installation complémentaire ===== | ||
+ | ==== Reconnaissance de la clef ==== | ||
+ | Nous souhaitons mettre les fichiers audios sur une clef USB, afin que leurs modifications soient plus aisées et que les photos prises soient aussi sauvegardées sur la clef. | ||
+ | |||
+ | Les clefs sont gérées par des fichiers situés dans le répertoire /dev. Afin de connaitre le nom du fichier. Avant d' | ||
+ | ls /dev | ||
+ | Une fois insérée tapez de nouveau : | ||
+ | ls /dev | ||
+ | Vous noterez des noms qui apparaîssent du style sdX et sdX Y. X prenant la forme d'une lettre (a, b, c, d, …) et Y d'un chiffre indiquant le numéro de partition de la clef. | ||
+ | |||
+ | Ici, apparaissent sda et sda 1 | ||
+ | ==== Montage de la clef ==== | ||
+ | Avant de procéder au montage proprement dit, il faut créer un répertoire qui permettra de naviguer dedans. | ||
+ | mkdir /media/usb | ||
+ | Ensuite ouvrir le fichier mtab | ||
+ | sudo nano /etc/mtab | ||
+ | Observer le fichier aucune ligne ne doit commencer par : /dev/sda1 /media/usb | ||
+ | Ctrl + X pour quitter | ||
+ | Monter le la partition de la clef : | ||
+ | sudo mount -t vfat /dev/sda1 /media/usb -o rw, | ||
+ | Ouvrez de nouveau mtab | ||
+ | sudo nano /etc/mtab | ||
+ | La dernière ligne commence par : /dev/sda1 /media/usb | ||
+ | Copier cette ligne | ||
+ | Ctrl + x pour quitter | ||
+ | Ouvrez le fichier fstab | ||
+ | sudo nano /etc/fstab | ||
+ | Coller la ligne à la fin du fichier. Ctrl + o, Ctrl + x pour enregistrer et quitter | ||
+ | sudo reboot | ||
+ | Pour que tout soit bien intégrer. | ||
+ | |||
+ | |||
===== Code ===== | ===== Code ===== | ||
+ | A tester : | ||
+ | cat file.wav > /dev/audio | ||
==== Fichier de configuration de la caméra ==== | ==== Fichier de configuration de la caméra ==== | ||
Placer un fichier config.txt dans le répertoire où est placé le fichier en C | Placer un fichier config.txt dans le répertoire où est placé le fichier en C | ||
Ligne 168: | Ligne 306: | ||
==== Code C pour la Raspberry Pi ==== | ==== Code C pour la Raspberry Pi ==== | ||
<code c> | <code c> | ||
- | // gcc -Wall -o test test.c -lwiringPi | + | // g++ -Wall -o test `cups-config --cflags` |
#include < | #include < | ||
Ligne 176: | Ligne 314: | ||
#include < | #include < | ||
#include < | #include < | ||
+ | #include < | ||
#include < | #include < | ||
#include < | #include < | ||
+ | #include < | ||
+ | #include < | ||
+ | |||
+ | #include < | ||
+ | #include < | ||
+ | |||
+ | #define boutonPhoto 26 // Fil rouge | ||
+ | #define vibrationArduino 27 // Fil vert | ||
+ | #define declenchementArduino 28 // Fil jaune | ||
+ | #define monnayeur 29 // Fil blanc | ||
- | #define declenchementArduino 16 | ||
int nbPhotos = 0; | int nbPhotos = 0; | ||
time_t compteurTemps; | time_t compteurTemps; | ||
+ | static pid_t pidAttente = 0; | ||
+ | static pid_t pidProcedure = 0; | ||
+ | static pid_t pidPhoto = 0; | ||
+ | static pid_t pidAssistance = 0; | ||
+ | |||
+ | int attente = 0; | ||
+ | int procedure = 0; | ||
void reverse(char s[]) | void reverse(char s[]) | ||
Ligne 193: | Ligne 348: | ||
s[j] = c; | s[j] = c; | ||
} | } | ||
- | } | + | } |
void itoa(int n, char s[]) | void itoa(int n, char s[]) | ||
{ | { | ||
Ligne 208: | Ligne 364: | ||
s[i] = ' | s[i] = ' | ||
| | ||
- | } | + | } |
void photo() { | void photo() { | ||
Ligne 214: | Ligne 370: | ||
if (difftime(temps, | if (difftime(temps, | ||
{ | { | ||
- | printf(" | ||
- | |||
compteurTemps = temps; | compteurTemps = temps; | ||
- | char buffer [6]; | + | |
- | itoa(nbPhotos, | + | procedure = 1; |
- | char src[40] = "/home/pi/ | + | kill(pidAttente, |
- | strcat(src, buffer); | + | printf(" |
- | strcat(src, " | + | if((pidProcedure = fork()) == 0) |
- | printf(" | + | { |
- | nbPhotos++; | + | execl("/ |
- | digitalWrite(declenchementArduino, | + | "/ |
- | static pid_t pid = 0; | + | " |
- | if ((pid = fork()) == 0) | + | " |
- | { | + | "/ |
- | // libcamera-jpeg -o photo_0.jpg -c config.txt | + | NULL); |
- | execl("/ | + | } |
+ | sleep(13); | ||
+ | digitalWrite(vibrationArduino, | ||
+ | sleep(1); | ||
+ | digitalWrite(vibrationArduino, | ||
+ | } else { | ||
+ | kill(pidProcedure, | ||
+ | printf(" | ||
+ | if((pidPhoto = fork()) == 0) | ||
+ | { | ||
+ | execl("/ | ||
+ | "/ | ||
+ | " | ||
+ | " | ||
+ | "/ | ||
+ | NULL); | ||
+ | } | ||
+ | sleep(5); | ||
+ | | ||
+ | itoa(nbPhotos, | ||
+ | char src[40] = "/media/usb/ | ||
+ | strcat(src, buffer); | ||
+ | strcat(src, " | ||
+ | printf(" | ||
+ | nbPhotos++; | ||
+ | digitalWrite(declenchementArduino, | ||
+ | static pid_t pid = 0; | ||
+ | if ((pid = fork()) == 0) | ||
+ | { | ||
+ | // libcamera-jpeg -o photo_0.jpg -c config.txt | ||
+ | execl("/ | ||
+ | | ||
+ | | ||
+ | " | ||
+ | | ||
+ | | ||
+ | } | ||
+ | sleep(1); | ||
+ | digitalWrite(declenchementArduino, | ||
+ | FILE * fichier ; | ||
+ | do | ||
+ | { | ||
+ | fichier = fopen(src, " | ||
+ | } while (fichier == NULL); | ||
+ | fclose(fichier); | ||
+ | static pid_t pid1 = 0; | ||
+ | if ((pid1 = fork()) == 0) | ||
+ | { | ||
+ | // convert -crop 3836x2592+386+0 -rotate -90 Photos/ | ||
+ | execl( | ||
+ | "/ | ||
+ | "", | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | src, src, | ||
+ | NULL); | ||
+ | } | ||
+ | sleep(2); | ||
+ | //const char *filename = " | ||
+ | |||
+ | // Impression de la photo | ||
+ | http_t *http; | ||
+ | ipp_t *request, *response; | ||
+ | |||
+ | static const char * const requested_attributes[] = | ||
+ | { | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | }; | ||
+ | http = httpConnect2(" | ||
+ | |||
+ | request = ippNewRequest(IPP_OP_PRINT_JOB); | ||
+ | ippAddString(request, | ||
+ | ippAddString(request, | ||
+ | ippAddString(request, | ||
+ | ippAddString(request, | ||
+ | ippDelete(cupsDoFileRequest(http, | ||
+ | sleep(17); | ||
+ | kill(pidPhoto, | ||
+ | |||
+ | // Test si il manque du papier | ||
+ | ipp_attribute_t *attr; | ||
+ | char value[2048]; | ||
+ | // Procedure | ||
+ | uint8_t erreur; | ||
+ | uint8_t assistance = 0; | ||
+ | do { | ||
+ | erreur = 0; | ||
+ | request = ippNewRequest(IPP_OP_GET_PRINTER_ATTRIBUTES); | ||
+ | ippAddString(request, | ||
+ | ippAddString(request, | ||
+ | ippAddStrings(request, | ||
+ | |||
+ | response = cupsDoRequest(http, | ||
+ | for (attr = ippFirstAttribute(response); | ||
+ | { | ||
+ | if (strcmp(ippGetName(attr), | ||
+ | { | ||
+ | ippAttributeString(attr, | ||
+ | std::string valeur(value); | ||
+ | std::size_t erreurCartouche = valeur.find(" | ||
+ | std::size_t erreurPapier = valeur.find(" | ||
+ | if (erreurCartouche <= 2048) | ||
+ | { | ||
+ | // Plus d' | ||
+ | erreur = 1; | ||
+ | if (assistance == 0) { | ||
+ | printf(" | ||
+ | |||
+ | assistance = 1; | ||
+ | if((pidAssistance = fork()) == 0) | ||
+ | { | ||
+ | execl("/ | ||
+ | "/ | ||
+ | " | ||
+ | " | ||
+ | "/ | ||
+ | NULL); | ||
+ | } | ||
+ | } | ||
+ | } | ||
+ | if (erreurPapier <= 2048) | ||
+ | { | ||
+ | // Plus de papier | ||
+ | erreur = 2; | ||
+ | if (assistance == 0) { | ||
+ | printf(" | ||
+ | |||
+ | assistance = 1; | ||
+ | |||
+ | if((pidAssistance = fork()) == 0) | ||
+ | { | ||
+ | execl("/ | ||
+ | "/ | ||
+ | " | ||
+ | " | ||
+ | "/ | ||
+ | NULL); | ||
+ | } | ||
+ | } | ||
+ | } | ||
+ | } | ||
+ | } | ||
+ | sleep(3); | ||
+ | } while (erreur != 0); | ||
+ | |||
+ | if (assistance != 0) { | ||
+ | kill(pidAssistance, | ||
+ | } | ||
+ | printf(" | ||
+ | procedure = 0; | ||
+ | attente = 0; | ||
} | } | ||
- | sleep(1); | ||
- | digitalWrite(declenchementArduino, | ||
- | FILE * fichier ; | ||
- | do | ||
- | { | ||
- | fichier = fopen(src, " | ||
- | } while (fichier == NULL); | ||
- | fclose(fichier); | ||
- | static pid_t pid1 = 0; | ||
- | if ((pid1 = fork()) == 0) | ||
- | { | ||
- | // convert -crop 3836x2592+386+0 -rotate -90 Photos/ | ||
- | execl("/ | ||
- | } | ||
- | sleep(2); | ||
- | | ||
- | | ||
- | static pid_t pid2 = 0; | ||
- | if ((pid2 = fork()) == 0) | ||
- | { | ||
- | // convert -crop 3836x2592+386+0 -rotate -90 Photos/ | ||
- | execl("/ | ||
- | } | ||
- | | ||
} | } | ||
} | } | ||
Ligne 261: | Ligne 544: | ||
{ | { | ||
wiringPiSetup(); | wiringPiSetup(); | ||
- | pinMode (15, INPUT); // Pin de l' | + | pinMode (boutonPhoto, INPUT); // Pin de l' |
- | pullUpDnControl(15, PUD_UP); | + | pullUpDnControl(boutonPhoto, PUD_UP); |
- | wiringPiISR (15, INT_EDGE_FALLING, | + | |
+ | pullUpDnControl(monnayeur, | ||
+ | |||
+ | // wiringPiISR (25, INT_EDGE_FALLING, | ||
pinMode (declenchementArduino, | pinMode (declenchementArduino, | ||
+ | pinMode (vibrationArduino, | ||
compteurTemps = time(NULL); | compteurTemps = time(NULL); | ||
- | // | + | |
- | /*static pid_t pid = 0; | + | |
- | if((pid = fork()) == 0) | + | |
- | { | + | |
- | execl("/ | + | |
- | }*/ | + | |
// Comptage des fichiers | // Comptage des fichiers | ||
struct dirent *dir; | struct dirent *dir; | ||
- | DIR *d = opendir("/ | + | DIR *d = opendir("/ |
if (d) | if (d) | ||
{ | { | ||
- | while ((dir = readdir(d)) != NULL) | + | while ((dir = readdir(d)) != NULL) |
{ | { | ||
if (dir-> | if (dir-> | ||
Ligne 287: | Ligne 569: | ||
closedir(d); | closedir(d); | ||
} | } | ||
+ | // Efface tous les travaux d' | ||
+ | system(" | ||
while(1) { | while(1) { | ||
+ | if (attente == 0) | ||
+ | { | ||
+ | attente = 1; | ||
+ | printf(" | ||
+ | // Message d' | ||
+ | if ((pidAttente = fork()) == 0) | ||
+ | { | ||
+ | execl("/ | ||
+ | "/ | ||
+ | " | ||
+ | " | ||
+ | "/ | ||
+ | NULL); | ||
+ | } | ||
+ | } | ||
+ | if ((digitalRead(monnayeur) == 0) && (attente == 1) && | ||
+ | | ||
+ | } | ||
+ | if ((digitalRead(boutonPhoto) == 0) && (attente == 1) && | ||
+ | | ||
+ | } | ||
} | } | ||
return 0; | return 0; | ||
Ligne 295: | Ligne 599: | ||
==== Code Arduino ==== | ==== Code Arduino ==== | ||
<code cpp> | <code cpp> | ||
+ | |||
#include < | #include < | ||
#define declencheur 2 | #define declencheur 2 | ||
#define posFermeVerrou 0 | #define posFermeVerrou 0 | ||
- | #define posOuvertVerrou | + | #define posOuvertVerrou |
#define posBrasLeve 137 | #define posBrasLeve 137 | ||
#define posBrasBaisse 65 | #define posBrasBaisse 65 | ||
+ | #define posVibHaut 0 | ||
+ | #define posVibBas 30 | ||
Servo verrou; | Servo verrou; | ||
Ligne 308: | Ligne 615: | ||
void setup() { | void setup() { | ||
pinMode(declencheur, | pinMode(declencheur, | ||
- | pinMode(8, | + | pinMode(8, |
pinMode(13, OUTPUT); | pinMode(13, OUTPUT); | ||
Ligne 320: | Ligne 627: | ||
sequence(); | sequence(); | ||
} | } | ||
- | if (digitalRead(8) == 0){ | + | if (digitalRead(8) == HIGH){ |
- | | + | |
} | } | ||
} | } | ||
+ | void vibration() { | ||
+ | for (int i = 0; i < 10; i++) { | ||
+ | verrou.write(posVibBas); | ||
+ | delay(150); | ||
+ | verrou.write(posVibHaut); | ||
+ | delay(150); | ||
+ | } | ||
+ | | ||
+ | } | ||
void sequence() { | void sequence() { | ||
- | delay(600); | + | delay(760); |
verrou.write(posOuvertVerrou); | verrou.write(posOuvertVerrou); | ||
delay(1500); | delay(1500); | ||
Ligne 337: | Ligne 653: | ||
} | } | ||
</ | </ | ||
+ | ===== Démarrage automatique ===== | ||
+ | sudo nano / | ||
+ | |||
+ | [Unit] | ||
+ | Description=Met en route l' | ||
+ | | ||
+ | [Service] | ||
+ | Type=simple | ||
+ | WorkingDirectory=/ | ||
+ | ExecStart=/ | ||
+ | Restart=on-failure | ||
+ | RestartSec=1 | ||
+ | User=pi | ||
+ | Group=pi | ||
+ | | ||
+ | [Install] | ||
+ | WantedBy=multi-user.target | ||
+ | |||
+ | sudo systemctl enable failomaton.service | ||
+ | |||
+ | sudo systemctl status failomaton.service | ||
===== Ressources en ligne ===== | ===== Ressources en ligne ===== | ||
[[https:// | [[https:// | ||
Ligne 371: | Ligne 708: | ||
[[https:// | [[https:// | ||
+ | |||
+ | [[https:// | ||
+ | |||
+ | [[https:// | ||
+ | |||
+ | [[https:// | ||
+ | |||
+ | [[https:// | ||
==== Synthèse vocale en ligne ==== | ==== Synthèse vocale en ligne ==== | ||
[[https:// | [[https:// | ||
Ligne 380: | Ligne 725: | ||
=== wiringPi === | === wiringPi === | ||
[[http:// | [[http:// | ||
- | === Pigpio === | + | |
- | [[http:// | + | |
=== Lire fichier audio === | === Lire fichier audio === | ||
[[https:// | [[https:// | ||
Ligne 387: | Ligne 731: | ||
[[https:// | [[https:// | ||
+ | [[https:// | ||
{{tag> raspberry_pi C++ sylvain}} | {{tag> raspberry_pi C++ sylvain}} |
failomaton.1700502565.txt.gz · Dernière modification : 2023/11/20 17:49 de Mushussu