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 |
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.
Ressources :
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 <couleur> pour imprimante 3D | rouge | ||
| filament <couleur> pour imprimante 3D | noir | ||
| filament <couleur> 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 ? |
| 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 |
Objectif 14 robots avec comme seul accessoire la pince.
STL des Pièces : https://cloud.lph.bzh/index.php/s/D0VB0A5Bi5igJXt
| Pièces | Impressions Benjamin | Impressions Yann | Simon |
|---|---|---|---|
| Têtes | |||
| Bases | |||
| Pinces | 2 pinces rouge avec attache | 4 pinces | |
| Roues | 10 roues |
| 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 |
Animation de l'atelier:
| 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 |
Nous remercions Yves et Matthieu pour accueillir le stage dans les locaux de l'UBO Open Factory.
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
Fichier de présentation
Exemple d'accessoire pour la tête:
Code OpenSCAD pour ajouter l'accessoire sur la tête:
#rotate([180,0,0]) import("<path>/Documents/Head.stl");
rotate_extrude() { polygon(points=[[0,0],[10,0],[10,10],[25,25],[0,25]]);
}
Exemple de texte pour le dozer:
Code OpenSCAD pour ajouter le texte sur le dozer:
#translate([0,0,-23]) rotate([-90,-90,0]) import("<path>/Documents/Dozer.stl");
translate ([-12,15,-3]) linear_extrude(height=5) {
text("LPH");
}
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.h>
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 <NewPing.h>
#include <Servo.h>
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 <NewPing.h>
#include <Servo.h>
#include <SoftwareSerial.h>
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 <NewPing.h>
#include <Servo.h>
#include <SoftwareSerial.h>
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");
}