Arduino – Python – HC-SR04 – Rick Roll

Ces temps-ci, j’apprends à coder en Python. J’ai donc appris à utiliser le port série pour intéragir avec une carte Arduino. Pour tester ça, je me suis inspiré de cette vidéo : https://www.youtube.com/watch?v=e-l3jg13Pdk. Bien sûr, ma méthode est tout à fait différente et moins efficace; je n’utilise pas d’audio shield ou un capteur très performant.

Le montage est très simple. Il est composé d’une carte arduino, d’un module de détection à ultrason HC-SR04 et de 4 fils. Le capteur a une portée comprise entre 2cm et 4m avec une précision de 3mm et un angle de 15°.

L’idée est la suivante : quand on est à une certaine distance du capteur, la musique se lance. Si on s’éloigne, la musique se met en pause. Elle reprendra dès qu’on sera de nouveau à bonne distance. Donc arduino se charge du capteur et du calcul de la distance puis envoit cette dernière sur le port série. Python lit la valeur et lance ou non la musique.

Le code pour la carte Arduino :

const byte trigger = 2; //déclaration du pin pour le trigger
const byte echo = 3; //déclaration du pin pour l’echo

void setup()
{

Serial.begin(9600); //on démarre la liaison série
pinMode(trigger, OUTPUT);
pinMode(echo, INPUT);
digitalWrite(trigger, LOW); //le trigger doit être à l’état bas initialement

}

void loop()
{

digitalWrite(trigger, HIGH); //on met le trigger à l’état haut
delayMicroseconds(10); //pendant 10 µs
digitalWrite(trigger, LOW); //puis on le remet à l’état bas

long mesure = pulseIn(echo, HIGH, 25000); //on mesure le temps pendant lequel l’echo se met à l’état haut (réception du son)
long distance = mesure * 0.034 / 2; //on calcule la distance
Serial.println(distance); //on envoit la distance calculée
delay(60); //on attend  60ms avant de recommencer (limite du capteur). Il faut attendre 60ms pour que la musique se mette en pause ou se lance.

}

Le code Python :

#!/usr/bin/python3.4 # à adapter selon votre OS
# -*-coding:utf-8 -* # idem

import pygame # il faut utiliser le module pygame pour se servir de l’audio
from pygame.locals import *
import serial

pygame.init()
pygame.init() # on le met 2 fois au cas où. Sur certaines distrib linux, l’initialisation plante 1 fois sur 2.
son = pygame.mixer.Sound(« rickroll2.ogg ») # on crée un objet Sound et on précise la musique voulue (même dossier que le code et en format .wav ou .ogg)
ser = serial.Serial(‘/dev/ttyACM0’,9600) # on crée un objet Serial et on précise le port série (en bas à droite dans l’IDE arduino) et le nombre de bits par seconde (le même que pour arduino)
i=0 # on déclare une variable i qui vaut 0 initialement et qui prendra la valeur 1 au premier passage devant le capteur

while True:

distance = int(ser.readline()) # on lit la valeur dans le port série, on la converti en int (readline() donne un char) et on nomme cette valeur distance

if distance <= 50: # vous pouvez changer 50 par un autre nombre. Représente le seuil de lancement de la musique

if i == 0: # si on n’est jamais passé à moins de 50cm du capteur

i += 1 # la variable i vaut 1
son.play() # on lance la musique

if i > 0: # si on est déjà passé à moins de 50cm on relance la musique

pygame.mixer.unpause()

if distance > 50 and i > 0: # si on est à plus de 50 cm du capteur et qu’on est déjà passé devant

pygame.mixer.pause() # on met la musique en pause

ser.close() # on ferme la lecture sur le port

 

Parfois, lorsqu’on lance le programme python, l’erreur suivante survient :

Traceback (most recent call last):
File « rickroll.py », line 14, in <module>
distance = int(ser.readline())
ValueError: invalid literal for int() with base 10: ’13\r12\r\n’

Il suffit de renvoyer le script (et recommencer si l’erreur resurvient).

La musique est la version orchestrale de Never Gonna Give You Up de Rick Astley composée par Walt Ribeiro sur http://fororchestra.com/post/19459300022/rick-astley-never-gonna-give-you-up-for-orchestra . Cette version est sous licence Creative Commons. Pour Rick Roll comme il se doit, il faut donc utiliser la chanson originale.

Plus d’infos concernant le capteur de distance HC-SR04 : http://www.micropik.com/PDF/HCSR04.pdf

Arduino + LCD 128*64 compatible KS0108

Dans cet article, je ne vais pas vous faire un cours détaillé pour la simple et bonne raison que je ne connais pas les détails du truc. Je vais juste vous expliquer comment installer cette librairie et comment faire les branchements.  Je vous tutote (oui, je sais, ça ne se dit pas) ceci car ça m’a pris une plombe pour trouver des sites expliquant comment faire et que tous étaient en anglais et/ou foutrement mal expliqué. Donc comme vous ne parlez pas tous la langue de Shakespeare et que je suis gentil, je vous offre mon expérience.

NB : il faut absolument que votre écran soit compatible KS0108 ; Sinon, ce qui est écrit en dessous ne fonctionnera pas.

Je possède cet écran, acheté chez Kibuck. Bien évidemment (sinon ça ne serait pas drôle), le datasheet n’est pas disponible.

Premièrement, veuillez vous rendre ici et téléchargez l’archive. Ensuite, créez un dossier glcd dans sketchbook/libraries puis dézippez l’archive dans ce dossier.

Deuxièmement, dans votre IDE, ouvrez le fichier GLCDdemo en allant dans Fichier -> Exemples -> glcd puis cliquez sur vérifier. A partir de ce moment, 2 solutions. Soit ça compile correctement et donc vous êtes content soit ça vous fout pleins d’erreurs de compilation. Si comme moi vous êtes dans la réponse B, n’ayez crainte, il y a une solution (merci à @semageek pour son aide).

Normalement l’erreur est du genre : /sketchbook/libraries/glcd/fonts/Arial14.h:55:27: error: variable ‘Arial_14’ must be const in order to be put into read-only section by means of ‘__attribute__((progmem))’.

Pour remédier à ça, il vous faut juste ouvrir le fichier mentionné par l’erreur (ici Arial14.h) et de rajouter const après tous les static. Dès que vous avez fait ça sur tous les fichiers en cause, ça compilera.

Maintenant, passons au branchement. Pour cela, il faut vous munir du datasheet. Ensuite, admirez ce tableau :

Grâce au datasheet, déterminez dans quel panel vous êtes. Pour trouver le bon, il suffit de regarder, dans le datasheet, à quoi correspond chaque trou sur le module lcd. Par une puissante analyse du tableau, vous remarquez qu’il suffit de regarder à quoi correspond le premier trou. Si celui-ci correspond au 5V alors c’est le panel A. Si il correspond à la masse alors c’est le panel B. Sinon, c’est le panel C.

Vous vous demandez peut-être comment j’ai fait pour déterminer mon panel alors que je n’ai pas le datasheet. Et bien, j’ai fait l’aventurier. Même si ce n’est pas recommandé, j’ai fait des tests. Déjà, je savais que ce n’était pas le panel C car j’avais essayé ce branchement et que celui-ci allumait l’écran. J’ai testé le panel A. Cela n’a rien donné donc j’ai essayé le B. Et là, VICTOIRE !

Ensuite, il suffit de brancher suivant votre panel, de cette manière (pour arduino uno/duemilanove/leonardo. Pour les cartes mega/sanguino/teensy, référez-vous au tableau) :

Pour finir, vous n’avez plus qu’à téléverser GLCDdemo pour voir si tout fonctionne.

J’ai eu le droit à deux surprises à ce moment-là :

  • Si vous avez l’erreur avrdude: stk500_recv(): programmer is not responding alors il faut débrancher le pin reset. Ce pin (pour une raison que j’ignore) fait foirer le téléversement. Dès que le programme est chargé, vous pouvez rebrancher le pin reset.
  • Si, lors de la démo, vous constatez que la droite et la gauche sont inversées, il suffit d’inverser les pins qui ont pour fonction CSEL1 et CSEL2 (voir tableau).

Et voilà. Maintenant, vous pouvez vous la péter.

Voici une vidéo qui montre le résultat.

Si vous voulez plus de détails concernant l’utilisation de cette librairie, voici quelques liens :

http://playground.arduino.cc/Code/GLCDks0108

http://playground.arduino.cc/uploads/Code/GLCD_Documentation.pdf

Le tableau et les images des branchements viennent du pdf. Il est très bien expliqué donc je vous le recommande.