Outils pour utilisateurs

Outils du site


failomaton

Différences

Ci-dessous, les différences entre deux révisions de la page.

Lien vers cette vue comparative

Les deux révisions précédentesRévision précédente
Prochaine révision
Révision précédente
failomaton [2023/11/08 18:51] – [Installation d'omxplayer] Mushussufailomaton [2024/05/18 13:09] (Version actuelle) – [Caméra] Mushussu
Ligne 1: Ligne 1:
 ====== Failomaton ====== ====== Failomaton ======
 +Le projet est de réaliser un photomaton qui vous rate le portrait consciencieusement. Un bijou de technologie pour un résultat décevant.
 +
 +{{ :failomatonbeta1.mp4 |Version de test}}
 +
 +
 +==== A faire ====
 +* Un bouton de redémarrage du programme
 +* La gestion du manque de papier
 +* Monnayeur
 +===== Conception du distributeur de photos =====
 +{{:pieces_2d.png?200|Pièces 2D}}
 +
 +<code cpp>
 +
 +$fn = 200;
 +
 +// Épaisseur CP 10mm
 +
 +cote();
 +translate([350, 145]) rotate(180) cote();
 +translate([290, 165]) rotate(90) support();
 +
 +translate([305, 155]) rotate(90) mirror([0, 1, 0]) glissiere();
 +translate([330, 470]) rotate(180) glissiere();
 +
 +translate([15, 600]) rotate(-90) trapeze();
 +translate([123, 558]) mirror([0, 1, 0]) trapeze();
 +
 +// Épaisseur CP 15mm
 +
 +translate([-120, 50]) renfort1();
 +translate([-10, 50]) mirror([1, 0, 0]) renfort1();
 +
 +translate([-260, 0]) rotate(-30) ecarteur();
 +translate([-30, 30]) rotate(150) ecarteur();
 +
 +module cote() {
 +    difference() {
 +        union() {
 +            square([290, 150]);
 +            translate([90, -10]) square([30, 10]);
 +        }
 +        square([55, 6]); // Encoche rabat
 +        translate([290, 0]) rotate(-30) translate([-400, 0]) square([400, 200]);
 +        translate([0, 80]) rotate(-30) translate([-100, 0]) square([100, 100]);
 +        translate([265, 0]) rotate(-30) square([100, 100]); // Petite pointe
 +        translate([0, 80]) rotate(-30) translate([-100, 0]) square([100, 100]); 
 +        // Encoches glissieres
 +        translate([290,0]) rotate(-30) translate([-131.6, -10]) square([50, 11]); 
 +        translate([290,0]) rotate(-30) translate([-231.6, -10]) square([50, 11]);
 +    }
 +}
 +
 +module support() {
 +    difference() {
 +        square([236, 290]);
 +        translate([49.9, 34.9]) square([10.2, 30.2]);
 +        translate([175.9, 34.9]) square([10.2, 30.2]);
 +        translate([16.9, 84.9]) square([16.2,15.2]);
 +        translate([202.9, 84.9]) square([16.2,15.2]);
 +    }
 +}
 +
 +module glissiere() {
 +    difference() {
 +        square([331.6, 60]);
 +        square([60.1, 10]);
 +        translate([109.9, 0]) square([50.2, 10]);
 +        translate([209.9, 0]) square([150, 35]);
 +    }
 +}
 +
 +module trapeze() {
 +    difference() {
 +        square([135 * cos(30) + 40, 135 * sin(30)]);
 +        rotate(30) square([200, 200]);
 +        translate([0, 2]) difference() {
 +            translate([0, 58]) resize([320, 116]) circle(d=100);
 +            translate([0, 58]) resize([315.3, 111.5]) circle(d=100);
 +            translate([0, 58]) square([200, 100]);
 +        }
 +    }
 +    difference() {
 +        rotate(30) translate([-20, 0]) square([200, 30]);
 +        translate([0, 135 * sin(30)]) square([200, 100]);
 +    }
 +    translate([135 * cos(30) + 39.9,0]) square([0.1, 135 * sin(30)]); // Fil pour créer une poche pour la CNC
 +}
 +
 +module ecarteur() {
 +    difference() {
 +        rotate(30) translate([-20, 0]) square([200, 30]);
 +        translate([0, 135 * sin(30)]) square([200, 100]);
 +    }  
 +}
 +
 +module renfort1() {
 +    difference() {
 +        square([49.9, 50]);
 +        translate([-15, 0]) rotate(45) square([100, 100]);
 +    }
 +    translate([17, -10]) square([16, 10]);
 +}
 +</code>
 +===== Installation de ImageMagick =====
 +Installation du paquet
 +  sudo apt-get install imagemagick
 +Vérifier la bonne installation de ImageMagick
 +  identify -version
 +Pour tester le bon fonctionnement en convertissant un fichier .jpg en .png
 +  convert photo.jpg photo.png
 +Voici la méthode pour recadrer la photo afin qu'elle corresponde aux dimensions du papier hagaki :
 +  convert -crop 3836x2592+386+0 photo.jpg photo1.jpg
 +La méthode pour modifier l'orientation de l'image :
 +  convert -rotate -90 photo.jpg photo1.jpg
 ===== Installation de mplayer ===== ===== Installation de mplayer =====
   sudo apt-get install mplayer   sudo apt-get install mplayer
- Vérifier la bonne installation avec  +Vérifier la bonne installation avec  
-  mplayer -+  mplayer --version  
 +Afin d'optimiser le lecteur il faut éditer le fichier de configuration : 
 +  sudo nano ~/.mplayer/config 
 +A la fin du fichier ajouter cette ligne qui indique que nous n'avons pas besoin de télécommande 
 +  lirc=no
 Pour lancer un fichier audio Pour lancer un fichier audio
   mplayer /home/pi/Audio/audio01.wav   mplayer /home/pi/Audio/audio01.wav
Ligne 23: Ligne 142:
 ===== Installation de wiringPi ===== ===== Installation de wiringPi =====
 Attention la librairie WiringPi ne fonctionne que sous Raspbian 32bits et pour un modèle 4B au maximum. Attention la librairie WiringPi ne fonctionne que sous Raspbian 32bits et pour un modèle 4B au maximum.
-  sudo apt-get install wiringpi+  cd /tmp 
 +  wget https://project-downloads.drogon.net/wiringpi-latest.deb 
 +  sudo dpkg -wiringpi-latest.deb
 Vérifier l'installation avec Vérifier l'installation avec
   gpio -v   gpio -v
 La version doit être la 2.52 La version doit être la 2.52
 ===== Installation de l'imprimante ===== ===== Installation de l'imprimante =====
 +==== Mise en route de l'imprimante ====
 +Suivre les instructions du mode d'emploi pour installer l'imprimante.
 +
 +La seule configuration nécessaire est de désactiver l'extinction automatique
 +
 +Avec les flèches aller sur le menu configuration (L'image des outils), puis appuyer sur OK
 +
 +Aller sur Réglage de l'imprimante puis OK
 +
 +Aller avec la flèche du bas sur Extinction auto, OK
 +
 +Sélectionner Désac. puis Ok
 +
 +Puis appuyer sur Home
 ==== Installation de CUPS ==== ==== Installation de CUPS ====
 Sur une image de Raspberry fraichement installée et mise à jour. Installer CUPS : Sur une image de Raspberry fraichement installée et mise à jour. Installer CUPS :
Ligne 39: Ligne 174:
 Si vous êtes avec une Raspberry Pi sans écran et connectée en ssh, vous pouvez accéder à la page de configuration des imprimantes si vous suivez ces instructions : Si vous êtes avec une Raspberry Pi sans écran et connectée en ssh, vous pouvez accéder à la page de configuration des imprimantes si vous suivez ces instructions :
  
-Éditer ke fichier de configuration de CUPS :+Éditer le fichier de configuration de CUPS :
   sudo nano /etc/cups/cupsd.conf   sudo nano /etc/cups/cupsd.conf
 +Ajouter les ligne. suivantes au début du fichier :
 +  # Efface l'historiq<ue des tâches 
 +  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 90: Ligne 228:
  
 ==== Ajouter une nouvelle imprimante ==== ==== Ajouter une nouvelle imprimante ====
 +=== Configuration de CUPS ===
 Dès à présent, vous pouvez ouvrir un navigateur et accéder à la page de configuration à cette adresse : Dès à présent, vous pouvez ouvrir un navigateur et accéder à la page de configuration à cette adresse :
   https://failomaton.local:631/admin   https://failomaton.local:631/admin
 Si vous changez la configuration, il faudra vous identifier avec les éléments de CUPS Si vous changez la configuration, il faudra vous identifier avec les éléments de CUPS
 +
 +L'imprimante n'apparaît pas dans les imprimantes locales mais juste dans les imprimantes réseaux. Cliquer sur le bouton puis [Continuer]
 +
 +Sur la page Ajouter une imprimante cliquer juste sur continuer
 +
 +Sur la page suivante sélectionner dans le menu Canon SELPHY CP1300, driverless, cups-filters 1.28.17 (en), puis cliquer sur [Ajouter une imprimante]
 +
 +Sur la page Définir les options de l’imprimante
 +Vérifier que les paramètres par défaut sont bien cela :
 +
 +{{:parametres_cp1300.png?200|Paramètre du papier CP1300}}
 +
 +Cliquer sur [Définir les options par défaut]
 +
 +=== Impression d'une page test ===
 +
 +Cliquer sur [Imprimantes]
 +
 +Cliquer sur [Canon_SELPHY_CP1300]
 +
 +Maintenance > Imprimer une page test 
 +
 +=== Impression d'une photo ===
 +Dans un fenêtre du terminal :
 +Lister les imprimantes disponibles
 +  lpstat -p -d
 +Définir l'imprimante comme imprimante par défaut
 +  lpoptions -d Canon_SELPHY_CP1300
 +Pour imprimer une photo
 +  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'insérer la clef, tapez :
 +  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,users,umask=0
 +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 =====
 +A tester :
 +  cat file.wav > /dev/audio
 +==== Fichier de configuration de la caméra ====
 +Placer un fichier config.txt dans le répertoire où est placé le fichier en C
 +  sudo nano config.txt
 +Copier et coller ces éléments dans le fichier :
 +  timeout=2
 +  verbose=0
 +Ctrl O pour enregistrer puis valide puis Ctrl X pour quitter.
 +==== Code C pour la Raspberry Pi ====
 +<code c>
 +// g++ -Wall -o test `cups-config --cflags` test.c `cups-config --libs` -lwiringPi
 +
 +#include <dirent.h>
 +#include <stdio.h>
 +#include <unistd.h>
 +#include <wiringPi.h>
 +#include <string.h>
 +#include <signal.h>
 +#include <sys/types.h>
 +#include <time.h>
 +#include <stdlib.h>
 +#include <sys/wait.h>
 +#include <cups/cups.h>
 +
 +#include <string>
 +#include <iostream>
 +
 +#define boutonPhoto 26 // Fil rouge
 +#define vibrationArduino 27 // Fil vert
 +#define declenchementArduino 28 // Fil jaune
 +#define monnayeur 29 // Fil blanc
 +
 +int nbPhotos = 0;
 +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[])
 + {
 +     int i, j;
 +     char c;
 +
 +     for (i = 0, j = strlen(s)-1; i<j; i++, j--) {
 +         c = s[i];
 +         s[i] = s[j];
 +         s[j] = c;
 +     }
 +}
 +
 +void itoa(int n, char s[])
 + {
 +     int i, sign;
 +
 +     if ((sign = n) < 0)  /* record sign */
 +         n = -n;          /* make n positive */
 +     i = 0;
 +     do {       /* generate digits in reverse order */
 +         s[i++] = n % 10 + '0';   /* get next digit */
 +     } while ((n /= 10) > 0);     /* delete it */
 +     if (sign < 0)
 +         s[i++] = '-';
 +     s[i] = '\0';
 +     reverse(s);
 +}
 +
 +void photo() {
 +    time_t temps = time(NULL);
 +    if (difftime(temps, compteurTemps) > 5) // Permet d'éliminer les rebonds de l'interrupteur
 +    {
 +        compteurTemps = temps;
 +        if (procedure == 0) {
 +            procedure = 1;
 +            kill(pidAttente, SIGTERM);
 +            printf("Procedure\n");
 +            if((pidProcedure = fork()) == 0)
 +            {
 +                execl("/usr/bin/mplayer",
 +                    "/usr/bin/mplayer",
 +                    "-really-quiet",
 +                    "-loop", "0",
 +                    "/media/usb/Audio/Procedure.wav",
 +                    NULL);
 +            }
 +            sleep(13);
 +                digitalWrite(vibrationArduino, HIGH);
 +            sleep(1);
 +                digitalWrite(vibrationArduino, LOW);
 +         } else {
 +            kill(pidProcedure, SIGTERM);
 +            printf("Photo\n");
 +            if((pidPhoto = fork()) == 0)
 +            {
 +                execl("/usr/bin/mplayer",
 +                    "/usr/bin/mplayer",
 +                    "-really-quiet",
 +                    "-loop", "0",
 +                    "/media/usb/Audio/Photo.wav",
 +                    NULL);
 +            }
 +            sleep(5);
 +            char buffer [6];
 +            itoa(nbPhotos, buffer);
 +            char src[40] = "/media/usb/Photos/photo_" ;
 +            strcat(src, buffer);
 +            strcat(src, ".jpg");
 +            printf("%s\n",src);
 +            nbPhotos++;
 +            digitalWrite(declenchementArduino, HIGH);
 +            static pid_t pid = 0;
 +            if ((pid = fork()) == 0)
 +            {
 +                // libcamera-jpeg -o photo_0.jpg -c config.txt
 +                execl("/usr/bin/libcamera-jpeg",
 +                    "",
 +                    "-o", src,
 + "--shutter", "800000",
 +                    "-c", "config.txt",
 +                    NULL);
 +            }
 +            sleep(1);
 +            digitalWrite(declenchementArduino, LOW);
 +            FILE * fichier ;
 +            do
 +            {
 +                fichier = fopen(src, "r");
 +            } while  (fichier == NULL);
 +            fclose(fichier);
 +            static pid_t pid1 = 0;
 +            if ((pid1 = fork()) == 0)
 +            {
 +                // convert -crop 3836x2592+386+0 -rotate -90 Photos/photo_0.jpg Photos/photo1.jpg
 +                execl(
 +                    "/usr/bin/convert",
 +                    "",
 +                    "-crop",
 +                    "3836x2592+386+0",
 +                    "-rotate", "90",
 +                    src, src,
 +                    NULL);
 +            }
 +            sleep(2);
 +            //const char *filename = "photo.jpg";
 +
 +            // Impression de la photo
 +            http_t *http;
 +            ipp_t *request, *response;
 +
 +            static const char * const requested_attributes[] =
 +            {
 +                "printer-description",
 +                "job-template",
 +                "media-col-database"
 +            };
 +            http = httpConnect2("localhost", 631, NULL, AF_UNSPEC, HTTP_ENCRYPTION_IF_REQUESTED, 1, 30000, NULL);
 +
 +            request = ippNewRequest(IPP_OP_PRINT_JOB);
 +            ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_URI, "printer-uri", NULL, "ipp://localhost/printers/Canon_SELPHY_CP1300");
 +            ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_NAME, "requesting-user-name", NULL, "pi");
 +            ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_MIMETYPE, "document-format", NULL, "image/jpeg");
 +            ippAddString(request, IPP_TAG_JOB, IPP_TAG_KEYWORD, "media", NULL, "jpn_hagaki_100x148mm");
 +            ippDelete(cupsDoFileRequest(http, request, "/ipp/print", src));
 +            sleep(17);
 +            kill(pidPhoto, SIGTERM);
 +
 +            // 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, IPP_TAG_OPERATION, IPP_TAG_URI, "printer-uri", NULL, "ipp://localhost/printers/Canon_SELPHY_CP1300");
 +                ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_MIMETYPE, "document-format", NULL, "image/pwg-raster");
 +                ippAddStrings(request, IPP_TAG_OPERATION, IPP_TAG_KEYWORD, "requested-attributes", (int)(sizeof(requested_attributes) / sizeof(requested_attributes[0])), NULL, requested_attributes);
 +
 +                response = cupsDoRequest(http, request, "/ipp/print");
 +                for (attr = ippFirstAttribute(response); attr; attr = ippNextAttribute(response))
 +                {
 +                    if (strcmp(ippGetName(attr), "printer-state-reasons") == 0)
 +                    {
 +                        ippAttributeString(attr, value, sizeof(value));
 +                        std::string valeur(value);
 +                        std::size_t erreurCartouche = valeur.find("marker-supply-empty-error");
 +                        std::size_t erreurPapier = valeur.find("media-empty-error");
 +                        if (erreurCartouche <= 2048)
 +                        {
 +                            // Plus d'encre
 +                            erreur = 1;
 +                            if (assistance == 0) {
 +                                printf("Assistance\n");
 +
 +                                assistance = 1;
 +                                if((pidAssistance = fork()) == 0)
 +                                {
 +                                    execl("/usr/bin/mplayer",
 +                                    "/usr/bin/mplayer",
 +                                    "-really-quiet",
 +                                    "-loop", "0",
 +                                    "/media/usb/Audio/AssistanceCartouche.wav",
 +                                    NULL);
 +                                }
 +                            }
 +                        }
 +                        if (erreurPapier <= 2048)
 +                        {
 +                            // Plus de papier
 +                            erreur = 2;
 +                            if (assistance == 0) {
 +                                printf("Assistance\n");
 +
 +                                assistance = 1;
 +
 +                                if((pidAssistance = fork()) == 0)
 +                                {
 +                                    execl("/usr/bin/mplayer",
 +                                    "/usr/bin/mplayer",
 +                                    "-really-quiet",
 +                                    "-loop", "0",
 +                                    "/media/usb/Audio/AssistancePapier.wav",
 +                                    NULL);
 +                                }
 +                            }
 +                        }
 +                    }
 +                }
 +                sleep(3);
 +            } while (erreur != 0);
 +
 +            if (assistance != 0) {
 + kill(pidAssistance, SIGTERM);
 +        }
 +            printf("Fin Photo\n");
 +            procedure = 0;
 +            attente = 0;
 +        }
 +    }
 +}
 +
 +int main()
 +{
 +    wiringPiSetup();
 +    pinMode (boutonPhoto, INPUT); // Pin de l'interrupteur
 +    pullUpDnControl(boutonPhoto, PUD_UP);
 +    pinMode (monnayeur, INPUT); // Pin du monnayeur
 +    pullUpDnControl(monnayeur, PUD_UP);
 +
 +    //   wiringPiISR (25, INT_EDGE_FALLING, &monnayeur);
 +    pinMode (declenchementArduino, OUTPUT); // Pin de déclenchement de l'arduino
 +    pinMode (vibrationArduino, OUTPUT); // Pin de déclenchement de l'arduino
 +    compteurTemps = time(NULL);
 +
 +    // Comptage des fichiers
 +    struct dirent *dir;
 +    DIR *d = opendir("/media/usb/Photos/");
 +    if (d)
 +    {
 +        while ((dir = readdir(d)) != NULL)
 +        {
 +            if (dir->d_name[0] != '.')
 +            {
 +                nbPhotos++;
 +            }
 +        }
 +        //printf("%i\n", nbPhotos);
 +        closedir(d);
 +    }
 +    // Efface tous les travaux d'impression en cours
 +    system("cancel -a -x");
 +    while(1) {
 +        if (attente == 0)
 +        {
 +            attente = 1;
 +            printf("Invitation\n");
 +            // Message d'attente
 +            if ((pidAttente = fork()) == 0)
 +            {
 +                execl("/usr/bin/mplayer",
 +                    "/usr/bin/mplayer",
 +                    "-really-quiet",
 +                    "-loop", "0",
 +                    "/media/usb/Audio/Attente.wav",
 +                    NULL);
 +            }
 +        }
 +        if ((digitalRead(monnayeur) == 0) && (attente == 1) &&  (procedure == 0)) {
 +             photo();
 +        }
 +        if ((digitalRead(boutonPhoto) == 0) && (attente == 1) &&  (procedure == 1)) {
 +             photo();
 +        }
 +    }
 +    return 0;
 +}
 +</code>
 +==== Code Arduino ====
 +<code cpp>
 +
 +#include <Servo.h>
 +
 +#define declencheur 2
 +#define posFermeVerrou 0
 +#define posOuvertVerrou 90
 +#define posBrasLeve 137
 +#define posBrasBaisse 65
 +#define posVibHaut 0
 +#define posVibBas 30
 +
 +Servo verrou;
 +Servo bras;
 +
 +void setup() {
 +  pinMode(declencheur, INPUT);
 +  pinMode(8, INPUT);
 +  pinMode(13, OUTPUT);
 +
 +  bras.attach(6);
 +  verrou.attach(5);
 +  sequence();
 +}
 +
 +void loop() {
 +  if (digitalRead(declencheur) == HIGH) {
 +    sequence();
 +  }
 +  if (digitalRead(8) == HIGH){
 +    vibration();
 +  }
 +}
 +
 +void vibration() {
 +  for (int i = 0; i < 10; i++) {
 +    verrou.write(posVibBas);
 +    delay(150);
 +    verrou.write(posVibHaut);
 +    delay(150);
 +  }
 +  
 +}
 +void sequence() {
 +  delay(760);
 +  verrou.write(posOuvertVerrou);
 +  delay(1500);
 +  bras.write(posBrasLeve);
 +  delay(1000);
 +  verrou.write(posFermeVerrou);
 +  delay(500);
 +  bras.write(posBrasBaisse);
 +  delay(500);
 +}
 +</code>
 +===== Démarrage automatique =====
 +  sudo nano /etc/systemd/system/failomaton.service
 +
 +  [Unit]
 +  Description=Met en route l'installation Failomaton
 +  
 +  [Service]
 +  Type=simple
 +  WorkingDirectory=/home/pi/  
 +  ExecStart=/home/pi/./test  
 +  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://trevilly.com/photomaton-a-base-de-raspberry-pi-choix-1-ou-4-ou-8-photos-et-impression-directe/|Photomaton avec une Raspberry Pi]] [[https://trevilly.com/photomaton-a-base-de-raspberry-pi-choix-1-ou-4-ou-8-photos-et-impression-directe/|Photomaton avec une Raspberry Pi]]
Ligne 101: Ligne 682:
  
 [[https://trevilly.com/installer-une-imprimante-sur-raspberry-pi/|Installation d'une imprimante sur une Raspberry Pi]] [[https://trevilly.com/installer-une-imprimante-sur-raspberry-pi/|Installation d'une imprimante sur une Raspberry Pi]]
 +
 +[[https://raspberrytips.fr/installer-imprimante-raspberry-pi/|CUPS sur RPI]]
 +
 +[[https://www.cups.org/doc/options.html|Page d'option de CUOPS]]
 +
 ==== Monnayeur ==== ==== Monnayeur ====
 [[https://www.artcab.fr/portes-monnayeurs/194-monnayeur-comparatif-en-facade.html|Achat du monnayeur]] [[https://www.artcab.fr/portes-monnayeurs/194-monnayeur-comparatif-en-facade.html|Achat du monnayeur]]
Ligne 121: Ligne 707:
 [[https://magazines-attachments.raspberrypi.org/books/full_pdfs/000/000/036/original/Camera-Guide.pdf|Guide officiel de la caméra]] [[https://magazines-attachments.raspberrypi.org/books/full_pdfs/000/000/036/original/Camera-Guide.pdf|Guide officiel de la caméra]]
  
 +[[https://www.raspberrypi.com/documentation/computers/camera_software.html|Documentation des logiciels]]
 +
 +[[https://projects.raspberrypi.org/en/projects/infrared-bird-box/6|Mise au point module V2]]
 +
 +[[https://www.raspberrypi.com/news/raspberry-pi-camera-module-still-image-capture/|Déclenchement par signal]]
 +
 +[[https://www.framboise314.fr/test-des-nouvelles-cameras-raspberry-pi-v3-et-hq/|Pour la version 3]]
 +
 +[[https://blog.devmobile.co.nz/2022/01/24/libcamera-jpeg-on-raspberry-pi-os-bullseye-duration/|Liste des options]]
 ==== Synthèse vocale en ligne ==== ==== Synthèse vocale en ligne ====
 [[https://ttsreader.com/fr/|Simple d'utilisation]] [[https://ttsreader.com/fr/|Simple d'utilisation]]
  
 [[https://texttospeechrobot.com/text-to-speech-old/?variant=m1&rate=100&rate=50&rate=180&rate=0|Voix de synthèse]] [[https://texttospeechrobot.com/text-to-speech-old/?variant=m1&rate=100&rate=50&rate=180&rate=0|Voix de synthèse]]
 +
 +[[https://github.com/mattingalls/Soundflower/releases/tag/2.0b2|Permet à un Mac d'enregistrer les sons internes de l'ordinateur]]
 ==== Programmation ==== ==== Programmation ====
 === wiringPi === === wiringPi ===
 [[http://wiringpi.com|Site officiel]] [[http://wiringpi.com|Site officiel]]
-=== Pigpio === +
-[[http://abyz.me.uk/rpi/pigpio/cif.html#gpioSetISRFunc|Interruptions]]+
 === Lire fichier audio === === Lire fichier audio ===
-[[https://raspberry-projects.com/pi/programming-in-c/audio/playing-audio|Omxplayer]]+[[https://mplayerhq.hu/DOCS/man/en/mplayer.1.html#CONFIGURATION%20FILES|mplayer configuration]]
 === Autres === === Autres ===
 [[https://github.com/jeffmachyo/Raspberry-Pi-Camera-C-and-CPP|Utilisation caméra]] [[https://github.com/jeffmachyo/Raspberry-Pi-Camera-C-and-CPP|Utilisation caméra]]
  
 +[[https://mtodorovic.developpez.com/linux/programmation-avancee/?page=page_3|Processus]]
 {{tag> raspberry_pi C++ sylvain}} {{tag> raspberry_pi C++ sylvain}}
failomaton.1699469513.txt.gz · Dernière modification : 2023/11/08 18:51 de Mushussu