Aller au contenu


Photo
- - - - -

Jouons un peu avec les manettes de Wii :)


  • Veuillez vous connecter pour répondre
5 réponses à ce sujet

#1 Hexa Emails

Hexa Emails

    Membre passionné

  • Membres
  • PipPipPip
  • 439 messages
  • Gender:Male

Posté 02 mai 2011 - 09:28

Bon, comme ce ne sont pas des "créations" très "complexes", je fais un seul post pour tout, et j'édite au fur et à mesure:





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):



JTm84I7AJS0



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):

* a créé ce fichier. Tant que vous conservez cet avertissement,

* 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:



pqj3emMhKJ0



voilà le code coté ordinateur (en Processing):


* « LICENCE BEERWARE » (Révision 42):

* a créé ce fichier. Tant que vous conservez cet avertissement,

* 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):

* a créé ce fichier. Tant que vous conservez cet avertissement,

* 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]

#2 lordcuty

lordcuty

    Habitué

  • Membres
  • PipPip
  • 298 messages

Posté 03 mai 2011 - 06:37

beau projet, est-ce un début de projet sur le long terme?

#3 Jbot

Jbot

    Membre chevronné

  • Membres
  • PipPipPipPip
  • 801 messages
  • Gender:Male
  • Location:Paris

Posté 03 mai 2011 - 08:23

Haa cette bonne vieille licence Beerware :D

#4 Hexa Emails

Hexa Emails

    Membre passionné

  • Membres
  • PipPipPip
  • 439 messages
  • Gender:Male

Posté 03 mai 2011 - 04:15

C'est pas vraiment un projet long terme, je voulais utiliser le LCD pour afficher autre chose que d'afficher "hello world", et faire varier autrement sa luminosité que de façon linéaire avec le temps... faire une vraie application quoi! Et histoire de pas perdre la main ^^ Et c'était nécessaire!

#5 Leon

Leon

    Membre passionné

  • Membres
  • PipPipPipPipPip
  • 1 289 messages
  • Gender:Male

Posté 04 mai 2011 - 05:43

Tu as un autre truc que je trouve génial dans le WIIMOTE, c'est la mini caméra IR. Ca te localise de 1 à 4 spots IR dans l'image filmée. Tout ça en temps réel, et à une fréquence de raffraichissement de folie.

J'ai testé, ça fonctionne bien, et je vais très prochainement rajouter ça sur mon drone pour qu'il puisse se repérer avec des balises.
J'en parlais sur le forum d'en face:
http://www.robot-maker.com/forum/topic/3793-camera-ir-wii-remote/

Leon.

#6 Hexa Emails

Hexa Emails

    Membre passionné

  • Membres
  • PipPipPip
  • 439 messages
  • Gender:Male

Posté 04 mai 2011 - 12:28

Je m'en suis servi dans un projet tutoré (le programme de tableau interactif). Sur LetsMakeRobots, certains ont crée des robots "pompiers" qui détectent le feu grâce à cette caméra.
En plus, si on enlève le filtre IR, on peut repérer des points lumineux par exemple de pointeurs LASER rouge. mais on est plus sensibles aux interférences.

Je vais sans doute l'utiliser, mais je crois que je devrais passer à une autre librairie.




0 utilisateur(s) li(sen)t ce sujet

0 members, 0 guests, 0 anonymous users