Accéléromètre, arduino standalone + LCD
Salut à tous!
cela faisait bien longtemps que j'avais rien fait se rapprochant de la robotique (les stages en entreprise ça ramollit ^^ )
J'ai juste assemblé 3 trucs que j'arrivais à utiliser en un seul.
Ce n'était pas si simple (j'ai un peu galéré avec le code, dèja je suis pas doué pour ça de nature mais là en plus ça faisait longtemps)
J'ai essayé d'épurer un maximum, ma nouvelle passion c'est l'embarqué :p
Voilà ce que ça donne (ma chambre est tellement en bordel que j'ai migré vers la salle d'eau):
Et le code, mis à disposition si'il vous plait:
Remarque: il y a besoin d'une librairie "nunchuck_funcs.h", je peux filer le lien si ça intéresse quelqu'un.
* ----------------------------------------------------------------------------
* « LICENCE BEERWARE » (Révision 42):
*
* vous pouvez faire ce que vous voulez de ce truc. Si on se rencontre un jour et
* que vous pensez que ce truc vaut le coup, vous pouvez me payer une bière en
* retour. Alexis MAHE
* librement inspiré de Tod E. Kurt, http://thingm.com/
* ----------------------------------------------------------------------------
*/
#include
#include "nunchuck_funcs.h"
#include
LiquidCrystal lcd(8, 9, 10, 11, 12, 13);
int loop_cnt=0;
int accx,accy,accz,zbut,cbut,joyx,joyy;
void setup()
{
Serial.begin(9600);
nunchuck_setpowerpins();
nunchuck_init(); // send the initilization handshake
lcd.begin(16, 2);
lcd.print("AccX:");
lcd.setCursor(8, 0);
lcd.print("AccY:");
lcd.setCursor(0, 1);
lcd.print("AccZ:");
}
void loop()
{
if( loop_cnt > 100 ) { // every 100 msecs get new data
loop_cnt = 0;
nunchuck_get_data();
accx = nunchuck_accelx(); // ranges from approx 70 - 182
accy = nunchuck_accely(); // ranges from approx 65 - 173
accz = nunchuck_accelz();
zbut = nunchuck_zbutton();
cbut = nunchuck_cbutton();
joyx = nunchuck_joyx();
joyy = nunchuck_joyy();
lcd.setCursor(5, 0);
lcd.print(accx);
lcd.setCursor(13, 0);
lcd.print(accx);
lcd.setCursor(5, 1);
lcd.print(accz);
if(cbut)
{
analogWrite(5, joyy);
}
}
loop_cnt++;
delay(1);
}
[/code]
Fonctionnalités:
Affichage de valeurs d'accélérations sur un LCD,
Le rétroéclairage du LCD est contrôlé par le nunchuck (boutton C + joystick)
Le tout tourne sur un ATmega328 monté en standalone.
Le contrôle de la luminosité se fait par PWM (du vrai PWM ce coup ci, pas celui des servomoteurs :p )
Bon ben voilà c'est tout ^^
Asservissement en horizontalité d'un WiiMote
ça faisait un sacré moment que je voulais faire ça... surtout depuis que je ne suis plus "apeuré" par ce qui peut ressembler de près ou de loin à de l'automatique.
Cet asservissement est minable (cela se rapproche d'un type P si je ne me trompe pas), maistenant que j'ai la base (ben oui c'était difficile de mettre un servomoteur sur ma WiiMote), c'est appelé à être amélioré.
une petite vidéo, comme j'aime bien les faire:
voilà le code coté ordinateur (en Processing):
* « LICENCE BEERWARE » (Révision 42):
*
* vous pouvez faire ce que vous voulez de ce truc. Si on se rencontre un jour et
* que vous pensez que ce truc vaut le coup, vous pouvez me payer une bière en
* retour. Alexis MAHE
* utilise la librairie wrj4P5.
* ----------------------------------------------------------------------------
*/
import lll.wrj4P5.*;
import processing.serial.*;
Serial Arduino; //pour envoyer les ordres à l'arduino!!
Wrj4P5 wii; //pour utiliser la wiimote !!!
PFont font1;
String ordre;
boolean envoi;
float pitch=0,yaw=0;
int consigne=90 ,mesure, commande=90;
byte commandeserie;
int fc=3; //la fréquence de coupure de l'asservissement, enfin je crois que c'est plus 1/fc mais bon.
void setup() {
size(500,300);
wii=new Wrj4P5(this);
wii.connect();
frameRate(20);
println(Serial.list());
// liste et affiche tous les ports disponibles
Arduino = new Serial(this, Serial.list()[0], 9600);
//crée une connexion série avec l'arduino, le dernier argument est la vitesse
font1 = createFont("Courier", 60); // crée une police
}
void draw() {
textFont(font1);
background(0); //tout peindre en noir
stroke(255); //écrire en blanc
text("Consigne:",50,100);
text(consigne, 380, 100);
text("Mesure:",50,250);
text(mesure, 380, 250);
//sur les 2 lignes suivante on rend le signal plus facilement exploitable:
pitch= pitch + 0.2*( (int)(map(wii.rimokon.stablePitch(),-0.1,0.1,0,180))-pitch);
yaw = yaw + 0.2* ((int)(map(wii.rimokon.stableRoll(),-0.1,0.1,180,0))-yaw);
mesure= int(pitch);
//on adapte la consigne en foction de notre mesure.
commande = commande - (consigne-mesure)/fc;
commandeserie=byte(commande);
if(envoi)
{
Arduino.write(commandeserie);
println(commandeserie);
}
}
void buttonPressed(RimokonEvent evt, int rid) {
if (evt.wasPressed(RimokonEvent.A))
{
commande=90; //pour débugger
println("A");
envoi=!envoi; //pour déclencher l'envoi de données (et donc faire bouger le servo)
} //on doit appuyer une fois sur le bouton A de la WiiMote.
}
void keyPressed() { // évènements clavier
if (key == CODED){
if (keyCode == UP) consigne = consigne + 1;
if (keyCode == DOWN) consigne = consigne - 1;
}
}[/code]
le code coté arduino (simple, comme souvent lorsqeu j'utilise l'EEEpc elle me sert plus de carte I/O)
* ----------------------------------------------------------------------------
* « LICENCE BEERWARE » (Révision 42):
*
* vous pouvez faire ce que vous voulez de ce truc. Si on se rencontre un jour et
* que vous pensez que ce truc vaut le coup, vous pouvez me payer une bière en
* retour. Alexis MAHE
* ----------------------------------------------------------------------------
*/
#include
int ordre = 90;
Servo pitch;
#define pinpitch 9 //servo de direction "haut-bas"
void setup()
{
Serial.begin(9600);
pitch.attach(pinpitch,700,2100); // mon servomoteur est un peu défectueux, je le bride pour ne pas l'abimer.
pitch.write(ordre);
}
void loop()
{
pitch.write(ordre); //le servo se place à la consigne
if (Serial.available()) //si il y a une nouvelle consigne
{
ordre = Serial.read(); //obtenir la nouvelle consigne
}
} [/code]