Saga Eugène / InMoov : Jour 68 (Arduino / Pi / Tests)
By Anar on 07/10/2013, 17:32 - InMoov - Permalink
De son coté Gilou a mené ses propres tests avec le "doigt tutorial", une Arduino Uno et un Raspberry Pi.
Et voici ce qu'il m'a envoyé...
Merci Gilou !
1. Installation de Raspbian sur le Raspberry Pi
1.1. Configuration de raspbian
Normalement l'utilitaire de config se lance au démarrage (sinon, depuis un shell, taper : sudo raspi-config)
- Activation du serveur ssh (ça sera utile pour ne plus avoir besoin de connecter un clavier/souris)
- Overclock à 900Mhz
- Activation du desktop en automatique (le lancement sera désactivé plus tard).
- Choix du clavier FR
- Changement du mot de passe de l'utilisateur par défaut
- Disable du support camera
- Changement du hostname : eugene2-01
- Attribution de 16Mo au GPU
- Désactivation de l'overscan
1.2. Galère avec l'alimentation du Raspberry Pi qui plante le clavier et la souris.
- J'ai changé l'alimentation
- J'ai ajouté un hub USB
Pour l'instant, ça a l'air de mieux fonctionner.
2. Installation du package Arduino
2.1. depuis un shell, on envoie l'inévitable :
sudo apt-get update
Ça permet de récupérer la liste des derniers packages.
2.2. Toujours depuis le shell
sudo apt-get install arduino
3. Premier test : celui de la diode qui clignote
Le tuto http://www.arduino.cc/en/Main/Howto est utilisé pour ce test.
3.1. Réalisation du montage (tant bien que mal)
3.2. Lancement de l'éditeur "Arduino IDE"
3.3. Copié/Collé du source
3.4. Upload du code compilé sur l'Arduino
La diode clignote !
II. Communication série Raspberry Pi -> Arduino
L'objectif est d'envoyer des ordres par la connection USB pour allumer et éteindre une diode depuis le Raspberry Pi.
1. Programme à faire exécuter par l'Arduino :
const int ledPin = 13; // the pin that the LED is attached to
int incomingByte; // a variable to read incoming serial data into
void setup() {
// initialize serial communication:
Serial.begin(9600);
// initialize the LED pin as an output:
pinMode(ledPin, OUTPUT);
}
void loop() {
// see if there's incoming serial data:
if (Serial.available() > 0) {
// read the oldest byte in the serial buffer:
incomingByte = Serial.read();
// if it's a capital H (ASCII 72), turn on the LED:
if (incomingByte == 'H') {
digitalWrite(ledPin, HIGH);
}
// if it's an L (ASCII 76) turn off the LED:
if (incomingByte == 'L') {
digitalWrite(ledPin, LOW);
}
}
}
2. Installation de la librairie python pySerial
A partir d'un shell, lancer tout simplement la commande :
sudo apt-get install python-serial
3. Programmes en python à exécuter depuis le Raspberry Pi
J'ai un peu galéré...
Lorsqu'on ouvre l'interface série, elle met un certain temps à s'initialiser du côté de l'Arduino et ce qu'on envoie pendant la phase d'initialisation est perdu.
Pour résoudre le problème, j'ai rajouté une tempo de 2 secondes entre l'ouverture et l'envoi de l'ordre.
3.1. Programme d'extinction de la diode en python (à exécuter côté Raspberry Pi)
import serial
import time
ser = serial.Serial('/dev/ttyACM0', 9600)
time.sleep(2)
ser.write('L')
3.2. Programme d'allumage de la diode en python (à exécuter côté Raspberry Pi)
import serial
import time
ser = serial.Serial('/dev/ttyACM0', 9600)
time.sleep(2)
ser.write('H')
III. Mise en oeuvre d'un servo moteur
1. Connexion du servo moteur à l'arduino
- Connecter le fil rouge du servo sur la borne +5V de l'Arduino
- Connecter le fil noir/brun du servo sur la borne Gnd de l'Arduino
- Connecter le fil blanc du servo sur la borne Analogique A0 de l'Arduino
2. Programme à uploader sur l'Arduino
#include <Servo.h>
Servo servo1; Servo servo2;
void setup() {
pinMode(1,OUTPUT);
servo1.attach(14); //analog pin 0
//servo1.setMaximumPulse(2000);
//servo1.setMinimumPulse(700);
// servo2.attach(15); //analog pin 1
Serial.begin(19200);
Serial.println("");
Serial.println("Ready");
}
void loop() {
static int v = 0;
if ( Serial.available()) {
char ch = Serial.read();
switch(ch) {
case '0'...'9':
v = v * 10 + ch - '0';
break;
case 's':
servo1.write(v);
Serial.println("ok");
v = 0;
break;
case 'd':
servo1.detach();
break;
case 'a':
servo1.attach(14);
break;
}
}
}
3. Programme pour envoyer les ordres permettant d'animer le doigt
#!/usr/bin/python
import sys
import serial
import time
#print 'Number of arguments:', len(sys.argv), 'arguments.'
#print 'Argument List:', str(sys.argv)
prevpos = 0
period = 180.0
ser = serial.Serial('/dev/ttyACM0', 19200)
def writepos(i):
global prevpos
ser.write(str(i) + 's')
line = ser.readline()
time.sleep(abs(prevpos - i)/period)
prevpos = i
print str(i) + '=>' + line
line = ser.readline()
line = ser.readline()
print line
writepos(0)
for k in range(0, 1000):
writepos(40)
for j in range(1, 5):
writepos(180)
writepos(40)
writepos(0)
time.sleep(2)
Et enfin une petite vidéo :
