====== Stage LPH: avril 2019 ====== ===== Introduction ===== Stage LPH d'avril à L'UBO Open Factory L'objectif de cet atelier est de réaliser un petit robot à base de micro-contrôleur. ^ Public cible | 12 jeunes | ^ Date | semaine 16: du 15 avril au 19 avril **sous réserve de confirmation des différents acteurs** | ^ Lieu | **UBO Open Factory** | ===== Modalités ===== Une inscription est nécessaire pour pouvoir planifier. Une adhésion (de 20 euros) et une participation financière (60 euros) pour le matériel seront demandées. * [[interne:pouradherer|Bulletin d'adhésion]] ===== Planning et contenu ===== * Communication * Inscription et vérification de la faisabilité du projet (en compétences, en temps, en matériels si besoin et en coût matériel) * Validation inscription et devis matériel * Planification du projet sur la semaine de mai (en fonction du temps...) Ressources : * Inspiration : Little Bot : https://www.instructables.com/id/LittleBot-3D-Printed-Arduino-Mobile-Robot/ * Fichiers STL : https://www.thingiverse.com/thing:2417739/files ===== État du stock et matériel nécessaire pour le stage ===== Voici une première liste de matériel pour le stage: ^ Intitulé ^ Quantité nécessaire ^ Quantité à commander/produire ^ Etat ^ | Node MCU ESP 32 | 1 * 12 | 12 | à commander (ou arduino nano + module bluetooth) | | cartes de support pour les éléments | 1 * 12 | 12 | à commander avec le MCU | | Servo moteur roue 360° | 2 * 12 | 24 | à commander | | Servo moteur pince | 1 * 12 | 12 | à commander | | Module Ultra son | 1 * 12 | | à vérifier dans le stock | | Bloc pile alimentation | 1 * 12 | | à vérifier dans le stock | | pile alimentation | 4 * 12 | 48 | à commander | | fils/nappe de connexion | plein | | à vérifier dans le stock | | filament pour imprimante 3D | rouge | | | | filament pour imprimante 3D | noir | | | | filament pour imprimante 3D | blanc | | | | colle pour le plateau imprimante 3D | | | | | matériel pour le plateau imprimante 3D | | | | | scotch pour le plateau imprimante 3D | | | | Matériel hors-kit à préparer pour la tenue de l'atelier: ^ Intitulé ^ Quantité ^ A préparer ^ | rallonge | 2 | | | multiprise | 4 | | | PC portable: | 12 | au moins 9 de prêt | | alimentations PC | 12 | | | souris PC | 12 | à vérifier | | fers à souder | 3/4 | en cas de besoin | | tapis pour fer à souder | 3/4 | | | support fer à souder | 3/4 | | bobine étain | 1 | | | fils | | | | multimètre | 1 | en cas de besoin | | imprimante 3D | 1 | Ultimaker pour imprimer les pièces ? | ===== Liste des tâches ===== ^ Tâche ^ Qui ^ Opération ^ | Faire l'état du stock| Christian et Stéphane | | | Commande matériel | Christian et Stéphane | | | Communication sur les listes de diffusion | Christian et Stéphane | | | Communication "Affiche" | | | | Gestion des inscriptions | | | | Validation des inscriptions | | | | Planification des projets | | | | Développement logiciel | Simon | cahier des charges à prévoir | ===== Impressions 3D ===== Objectif **14 robots** avec comme seul accessoire la pince. La base est à revoir : creuser plus pour le PCB et le passage des câbles des servo moteurs. STL des Pièces : https://cloud.lph.bzh/index.php/s/D0VB0A5Bi5igJXt * Base Custom LPH (pas encore validée) * Head * Wheel (version creusée Wheel2) * Gripper (pince) * Support servo * Doigt 1 * Doigt 2 * Gripper Attachment ( à prendre sur les fichiers originaux https://www.thingiverse.com/download:3877090 ) ==== Impressions A faire ==== ^ Pièces ^ Impressions Benjamin ^ Impressions Yann ^ Simon ^ | Têtes | | | | | Bases | | | | | Pinces | 2 pinces rouge avec attache | | 4 pinces | | Roues | | | 10 roues | ==== Impressions Faites ==== ^ Pièces ^ Impressions Benjamin ^ Impressions Yann ^ | Têtes | 3 tête rouge + 2 têtes jaunes + 4 têtes bleu | 2 noires + 2 vertes + 2 blanches | | Base | 3 Bleues + 4 bases rouges + 2 bases grises | 2 blanches + 2 vertes + 2 noires | | Roues (unitaires) | 7 roues bleus + 2 roues rouges | 6 noires + 4 blanches + 4 vertes | | Pinces | | | ===== Présent pour animer ===== Animation de l'atelier: * Stéphane Blanc * Christian Jacolot * Benjamin * Arnaud (mercredi après midi et jeudi) * Simon (mercredi après midi peut-être et jeudi et vendredi à priori) * Tanguy (jeudi) * ===== Déroulé du projet ===== * Présentation du projet * Validation du matériel et des logiciels installés sur le PC * Montage * Programmation ===== Contacts ===== ^ Structure ^ Nom Prénom ^ Rôle sur le projet / poste ^ | Maison du libre | Stéphane Blanc | Logistique et animation | | Maison du libre | Christian Jacolot | Logistique et animation | | Maison du libre | Benjamin | Logistique et animation | | Maison du libre | Arnaud | Développement et animation | | Maison du libre | Simon | Développement ( et animation :?:) | === Remerciements === Nous remercions Yves et Matthieu pour accueillir le stage dans les locaux de l'UBO Open Factory. === Préparation des PC === Installation de xubuntu 18.04 sur les PC, iso sur clé USB. Mise à jour et installation des logiciels/paquets nécessaires: $ sudo apt update $ sudo apt upgrade $ sudo apt install git mercurial build-essential arduino-core arduino-mk gcc-avr avr-libc openjdk-8-jdk $ sudo apt install squeak-vm squeak-plugins-scratch $ sudo apt install nodejs npm $ id $ sudo usermod -a -G dialout $USER $ more /etc/group # télécharger arduino sur arduino.cc / linux 32 bits $ cd Téléchargements/ $ tar xf arduino-1.8.8-linux32.tar.xz $ cd arduino-1.8.8/ $ ./install.sh $ cd # démarrer arduino IDE # menu Outils / Gérer les bibliothèques # installer: circuit playground, unified sensor, DHT sensor library $ sudo npm install -g --unsafe-perm node-red $ node-red # navigateur web sur localhost:1880 # installer via palette: node-red-node-serialport et node-red-dashboard $ sudo apt install logisim openssh-server $ sudo apt install gcc-avr avr-libc flashplugin-installer algobox blender python3-dev python3-setuptools python3-numpy $ sudo apt install python3-opengl ffmpeg libsdl-image1.2-dev libsdl-mixer1.2-dev libsdl-ttf2.0-dev libsmpeg-dev libsdl1.2-dev libportmidi-dev libswscale-dev libavformat-dev libavcodec-dev libtiff5-dev libx11-6 libx11-dev fluid-soundfont-gm timgm6mb-soundfont xfonts-base xfonts-100dpi xfonts-75dpi xfonts-cyrillic fonts-freefont-ttf libfreetype6-dev $ java -version $ javac -version $ sudo update-alternatives --config java # choisir java 8 $ java -version $ sudo add-apt-repository ppa:openscad/releases $ sudo apt update $ sudo apt install openscad $ sudo apt install fritzing fritzing-parts gimp === Présentation === == Documents == Fichier de présentation === 3D === Exemple d'accessoire pour la tête: {{:projets:2019:atelier_lph_head_debug.png?400|}} Code OpenSCAD pour ajouter l'accessoire sur la tête: #rotate([180,0,0]) import("/Documents/Head.stl"); rotate_extrude() { polygon(points=[[0,0],[10,0],[10,10],[25,25],[0,25]]); } Exemple de texte pour le dozer: {{:projets:2019:atelier_lph_dozer.png?400|}} Code OpenSCAD pour ajouter le texte sur le dozer: #translate([0,0,-23]) rotate([-90,-90,0]) import("/Documents/Dozer.stl"); translate ([-12,15,-3]) linear_extrude(height=5) { text("LPH"); } === Code === Pour récupérer le code du robot adapté: $ git clone https://git.archieri.fr/simon/SimpleBotArduino.git Android APK pour le robot Arduino: https://cloud.archieri.fr/s/WzxmeGBmEKow5co Test Servo # include Servo servoLeft; Servo servoRight; void setup() { servoLeft.attach(11); servoRight.attach(10); Serial.begin(9600); } void loop() { servoLeft.write(90); // 0 => sens, 180 => autre sens servoRight.write(90); // } void stop() { servoLeft.write(90); // 0 => sens, 180 => autre sens servoRight.write(90); // } void avancer() { servoLeft.write( xx ); // 0 => sens, 180 => autre sens servoRight.write( xx ); // } void reculer() { servoLeft.write( xx ); // 0 => sens, 180 => autre sens servoRight.write( xx ); // } void tourner() { servoLeft.write( xx ); // 0 => sens, 180 => autre sens servoRight.write( xx ); // } Avec le sonar #include #include Servo servoLeft; Servo servoRight; NewPing sonar(7, 6, 200); void setup() { servoLeft.attach(11); servoRight.attach(10); Serial.begin(9600); } void loop() { gestionSonar(); } void gestionSonar() { int distance = sonar.ping_cm(); avancer(); if (distance < 10) { reculer(); tournerGauche(); } } void stop() { servoLeft.write(90); // 0 => sens, 180 => autre sens servoRight.write(90); // } void avancer() { servoLeft.write( 0 ); // 0 => sens, 180 => autre sens servoRight.write( 180 ); // } void reculer() { servoLeft.write( 180 ); // 0 => sens, 180 => autre sens servoRight.write( 0 ); // } void tournerGauche() { servoLeft.write(45); // 0 => sens, 180 => autre sens servoRight.write(45); // } void tournerDroite() { servoLeft.write(135); // 0 => sens, 180 => autre sens servoRight.write(135); // } Avec le bluetooth (message provenant du robot): #include #include #include Servo servoLeft; Servo servoRight; NewPing sonar(7, 6, 200); SoftwareSerial BTSerial(4, 8); // TX, RX void setup() { servoLeft.attach(11); servoRight.attach(10); //Serial.begin(9600); BTSerial.begin(9600); } void loop() { gestionSonar(); } void gestionSonar() { int distance = sonar.ping_cm(); avancer(); if (distance > 0 && distance < 10) { BTSerial.println("obstacle < 10cm"); reculer(); tournerGauche(); } } void stop() { servoLeft.write(90); // 0 => sens, 180 => autre sens servoRight.write(90); // BTSerial.println("stop"); } void avancer() { servoLeft.write( 0 ); // 0 => sens, 180 => autre sens servoRight.write( 180 ); // BTSerial.println("avance"); } void reculer() { servoLeft.write( 180 ); // 0 => sens, 180 => autre sens servoRight.write( 0 ); // BTSerial.println("recule"); } void tournerGauche() { servoLeft.write(45); // 0 => sens, 180 => autre sens servoRight.write(45); // BTSerial.println("gauche"); } void tournerDroite() { servoLeft.write(135); // 0 => sens, 180 => autre sens servoRight.write(135); // BTSerial.println("droite"); } Avec le bluetooth (piloter le robot): #include #include #include Servo servoLeft; Servo servoRight; NewPing sonar(7, 6, 200); SoftwareSerial BTSerial(4, 8); // TX, RX String message; void setup() { servoLeft.attach(11); servoRight.attach(10); //Serial.begin(9600); BTSerial.begin(9600); } void loop() { gestionSonar(); readBTSerial(); } String readBTSerial() { while (BTSerial.available()) { message = BTSerial.readString(); } if (message == "av\r\n") { avancer(); } else if (message == "ar\r\n") { reculer(); } else if (message == "g\r\n") { tournerGauche(); } else if (message == "d\r\n") { tournerDroite(); } } void gestionSonar() { int distance = sonar.ping_cm(); avancer(); if (distance > 0 && distance < 10) { BTSerial.println("obstacle < 10cm"); reculer(); tournerGauche(); } } void stop() { servoLeft.write(90); // 0 => sens, 180 => autre sens servoRight.write(90); // BTSerial.println("stop"); } void avancer() { servoLeft.write( 0 ); // 0 => sens, 180 => autre sens servoRight.write( 180 ); // BTSerial.println("avance"); } void reculer() { servoLeft.write( 180 ); // 0 => sens, 180 => autre sens servoRight.write( 0 ); // BTSerial.println("recule"); } void tournerGauche() { servoLeft.write(45); // 0 => sens, 180 => autre sens servoRight.write(45); // BTSerial.println("gauche"); } void tournerDroite() { servoLeft.write(135); // 0 => sens, 180 => autre sens servoRight.write(135); // BTSerial.println("droite"); }