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 :