Pages: 1 2
:rolleyes:Bonjour les p'tits génis !
Voilà je suis en train de découvrir les joies du monde Arduino, Processing & Cie.
Je suis étudiante aux Beaux-Arts en espagne actuellement et j'ai un proget d'istallation intéractive avec un sensor PIR, une lumière et une vidéo et une photo sur un ordinateur.
Si tout marche un jour l'idée est que lorsque quelqu'un s'approche du sensor la lumière s'éteigne et la vidéo (qui le reste du temps est en boucle) s'arrête et passe à une photo.
Mon sensor Pir je l'ai programmé via Arduino avec le sketch suivant piqué sur internet :
/*
* //////////////////////////////////////////////////
* //making sense of the Parallax PIR sensor's output
* //////////////////////////////////////////////////
*
* Switches a LED according to the state of the sensors output pin.
* Determines the beginning and end of continuous motion sequences.
*
* @author: Kristian Gohlke / krigoo (_) gmail (_) com / http://krx.at
* @date: 3. September 2006
*
* kr1 (cleft) 2006
* released under a creative commons "Attribution-NonCommercial-ShareAlike 2.0" license
* http://creativecommons.org/licenses/by-nc-sa/2.0/de/
*
*
* The Parallax PIR Sensor is an easy to use digital infrared motion sensor module.
* (http://www.parallax.com/detail.asp?product_id=555-28027)
*
* The sensor?s output pin goes to HIGH if motion is present.
* However, even if motion is present it goes to LOW from time to time,
* which might give the impression no motion is present.
* This program deals with this issue by ignoring LOW-phases shorter than a given time,
* assuming continuous motion is present during these phases.
*
*/
/////////////////////////////
//VARS
//the time we give the sensor to calibrate (10-60 secs according to the datasheet)
int calibrationTime = 30;
//the time when the sensor outputs a low impulse
long unsigned int lowIn;
//the amount of milliseconds the sensor has to be low
//before we assume all motion has stopped
long unsigned int pause = 5000;
boolean lockLow = true;
boolean takeLowTime;
int pirPin = 3; //the digital pin connected to the PIR sensor's output
int ledPin = 13;
/////////////////////////////
//SETUP
void setup(){
Serial.begin(9600);
pinMode(pirPin, INPUT);
pinMode(ledPin, OUTPUT);
digitalWrite(pirPin, LOW);
//give the sensor some time to calibrate
Serial.print("calibrating sensor ");
for(int i = 0; i < calibrationTime; i++){
Serial.print(".");
delay(1000);
}
Serial.println(" done");
Serial.println("SENSOR ACTIVE");
delay(50);
}
////////////////////////////
//LOOP
void loop(){
if(digitalRead(pirPin) == HIGH){
digitalWrite(ledPin, HIGH); //the led visualizes the sensors output pin state
if(lockLow){
//makes sure we wait for a transition to LOW before any further output is made:
lockLow = false;
Serial.println("---");
Serial.print("motion detected at ");
Serial.print(millis()/1000);
Serial.println(" sec");
delay(50);
}
takeLowTime = true;
}
if(digitalRead(pirPin) == LOW){
digitalWrite(ledPin, LOW); //the led visualizes the sensors output pin state
if(takeLowTime){
lowIn = millis(); //save the time of the transition from high to LOW
takeLowTime = false; //make sure this is only done at the start of a LOW phase
}
//if the sensor is low for more than the given pause,
//we assume that no more motion is going to happen
if(!lockLow && millis() - lowIn > pause){
//makes sure this block of code is only executed again after
//a new motion sequence has been detected
lockLow = true;
Serial.print("motion ended at "); //output
Serial.print((millis() - pause)/1000);
Serial.println(" sec");
delay(50);
}
}
}
Basiquement ça ça marche quand je passe devant mon capteur la LED s'allume !
Mon soucis viendrais plutôt de Processing où je n'arrive pas à écrire un sketch pour faire que ma vidéo tourne en boucle jusqu'à ce que le sensor capte un mouvement et arrête la vidéo pour afficher ma photo. Le seul sketch que j'ai pu écrire c'était en contrôlant tout ça avec ma souris soit le fameux "MousePressed" ! Voilà mon sketch :
import processing.video.*;
Movie myMovie;
PImage pfc;
void setup() {
size(1680, 1050,P2D);
pfc = loadImage("photofc.jpg");
myMovie = new Movie(this, "Pou.mov");
myMovie.loop();
background(0);
}
void draw()
{
if (mousePressed == true) {
loadImage("photofc.jpg");
image(pfc,0,0);
} else {
background(0);
image(myMovie,480,237);
}
}
void mousePressed() {
myMovie.pause();
}
void mouseReleased() {
myMovie.loop();
}
Je suis plus que novice dans tout ça j'ai pas le langage encore bien formé ! ET je n'arrive pas à comprendre comment faire parler mon Arduino à mon processing en résumé... Tout ce qui concerne le serialport le serialevent avec un sensor PIR j'ai beau décortiquer tout ce qu'il y a sur le net je ne m'en sort pas.
Alors si il y a un génie bienfaiteur qui pouvait m'aider au plus vite je m'engage à lui être extrêmement reconnaissante de la manière qu'il choisira !!! (dans la mesure du faisable ! lol:P)
D'avance merciiiiiiiiiiiiiiiiiiiiiiiiiiiiiii !!!
Hors ligne
Hello,
Pas besoin de contrepartie servile, ici on t'aide volontiers si on le peux... seulement c'est pas la première fois que l'on voit débarquer un/une étudiant la veille de son installation en pleine panique
Ton capteur PIR, est fixé sur une de tes entrées numériques de ta plaquette Arduino :Il envoi un signal binaire pour signifier qu'un évènements est détecté... ou non.
il faut que tu écrive la nature de cet évènement dans un message Serial que tu enverra à processing.
ça peut donner quelque chose comme ça :
du côté de processing... pour recevoir tes infos il faut d'abord que tu importe la librairie adéquate :
citation :
import processing.serial.*;
après quoi tu crée une instance Serial que tu initialise dans ton void setup() :
citation :
///
Serial myPort;
/// a mettre dans ton setup()citation :
myPort = new Serial(this, Serial.list()[0], 9600);
myPort.bufferUntil(linefeed);
après quoi tu fais ce que tu veux de l'info que tu as récupérée :
citation :
void serialEvent(Serial myPort){
// récupération de ton message en String que l'on traduit en int et on vérifie la condition si le message est 0
// alors il se passe un truc, sinon il se passe un autre truc...
String myString = myPort.readStringUntil(linefeed);
if(myString != null){
int sensor = int(myString);
}
if(sensors==0){
ellipse(x, y, 15,15);
myMovie.pause();
}
else{
myMovie.loop();
}
}
voilà je suis pas certains de l'impeccabilité de ma proposition mais il est tot et j'ai du taf.
Sur ce bon courage et bon dimanche.
Hors ligne
Hola !
Merci oyster_twiter pour ton aide. Je vais bosser la-dessus et peut-être reposerai quelques petites questions
Bon dimanche !
Hors ligne
Au secours ça ne marche paaaaaaaas !
Hors ligne
Bonjour Mary64 et bienvenue,
Pour pouvoir t'aider, il faut que nous en sachions plus sur le problème. Peux tu décrire ce qui ne marche pas et envoyer ton code?
Hors ligne
Bonjour et merci de préter un peu d'attention à mon problème ...
En fait il faudrait m'expliquer si mon sketch arduino est bon et comment écrire mon sketch processing pour que grace à mon sensor PIR ma vidéo fasse pause et s'affiche la photo. Aussi si vous aviez une idée pour savoir comment connecter une lampe style ampoule au plafondà l'Arduino et qui soit allumée jusqu'à ce que se déclenche le capteur.
Ce qui commence à m'agacer c'est que sur internet je trouve des choses beaucoup plus complexes que ce que moi je veux obtenir. Il me semble que de manière simplifiée c'est un système de ON/OFF dont j'ai besoin.
Mais je n'ai pas le langage programmateur pour le moment et encore moins en anglais. Alors ça fait 4 jours que je suis enfermée chez moi à décortiquer le web et je ne trouve rien...
Et pour ce que m'avait répondu "oyster_twiter" je n'ai pas compris la première partie sur les variables à savoir si c'est quelque chose que j'écris dans processing ou dans arduino... Et le sketch processing je l'ai un peu complété mais je n'ai que le son de ma vidéo qui sort et aucune intérection... Voilà le sketch :
import processing.serial.*;
Serial myPort;
import processing.video.*;
Movie myMovie;
PImage pfc;
String myString;
int lf = 10;
int val = 0;
void setup() {
size(1000, 1000,P2D);
myPort = new Serial(this, "/dev/cu.usbserial-0000101D", 9600);
myPort.bufferUntil(lf);
pfc = loadImage("photofc.jpg");
myMovie = new Movie(this, "Pou.mov");
myMovie.loop();
}
void serialEvent(int serial){
String myString = myPort.readStringUntil(lf);
if(myString != null){
int val = int(myString);
}
if(val==0){
image(myMovie,0,0);
}
else{
loadImage("photofc.jpg");
image(pfc,0,0);
}
}
void draw(){
while(myPort.available() > 0){
val = myPort.read();
}
}
Merci d'avance pour l'éventuelle aide...
Hors ligne
désolé vraiment pas le temps de te répondre en profondeur.
les variables à créer dans arduino pour mieux les transmettre à processing. c'est dans cette variable que tu vas mettre la valeur de ton capteur (on ou off // 0 ou 1 // true ou false...)
good luck
Hors ligne
Pour éviter de s'arracher les cheveux sur ce genre de projet, il faut décomposer en plusieurs étapes, tester qu'elles fonctionnent, et puis tout relier.
Dans ton cas, ça donne :
- d'un côté, la carte électronique arduino et le capteur PIR, quel type d'information sortent de ce capteur? comment arduino les interprête ?
- de l'autre, processing qui affiche une vidéo ou une image selon un principe d'interaction simple
- entre les deux, une forme de communication et un type de données (ici arduino émet des données selon le protocole série, et processing doit recevoir des données selon le même protocole), et je crois que le gros de ton problème vient de là, si je relis le code que tu as envoyé, arduino envoie des messages du type :
........... done SENSOR ACTIVE --- motion detected at 5.1 sec motion ended at 8.5 sec --- motion detected at 13.2 sec motion ended at 18 sec
C'est ce qu'on peut comprendre en lisant les serial.print du code arduino que tu as donné au début. Le code processing doit être capable d'interpréter ces messages, ce qui n'est pas le cas pour l'instant. Si tu as juste besoin d'un on/off, il faut simplifier ces messages, donc à modifier dans le code arduino, une ligne suffit, pas besoin de motion detected, etc.
Serial.println("1"); // pour ON, dans la partie if(digitalRead(pirPin) == HIGH){ Serial.println("0"); // pour OFF, dans la partie if(digitalRead(pirPin) == LOW){
Maintenant pour processing, j'ai fait des modifs dans ton code et rajouté quelques commentaires dans la partie de réception du protocole série, ça fonctionne : il affiche vidéo ou image, je n'ai pas d'arduino tout prêt alors je n'ai pas fait l'essai pour la communication série, par contre j'ai ajouté une interaction à la souris, quand on clique et en laissant appuyé, c'est comme si le capteur était actif, quand on relache, il passe en OFF
Pour relier une ampoule à l'arduino, le principe est d'utiliser un relais (+ quelques composants) entre la carte arduino et le circuit électrique composé de l'ampoule, du fil, et de la prise et faire très attention car c'est branché sur du 220v ce qui peut faire très mal! Le relais fonctionne comme un interrupteur commandé par une petite tension venant de l'arduino.
Un exemple ici : http://www.glacialwanderer.com/hobbyrobotics/?p=9
Attention c'est une tension américaine (120V) donc il faut adapter, je te déconseille de te lancer dans ce genre de construction avant d'être plus à l'aise avec ce que tu manipules
Hors ligne
Merci beaucoup pour la réponse mais c'est pas encore ça ... Enfin je pense que c'est moi quii fait quelque chose de mal...
Voilà mon Arduino maintenant :
int calibrationTime = 30; long unsigned int lowIn; long unsigned int pause = 5000; boolean lockLow = true; boolean takeLowTime; int pirPin = 2; int ledPin = 13; void setup(){ Serial.begin(9600); pinMode(pirPin, INPUT); pinMode(ledPin, OUTPUT); digitalWrite(pirPin, LOW); } void loop(){ if(digitalRead(pirPin) == HIGH){ digitalWrite(ledPin, HIGH); if(lockLow){ lockLow = false; Serial.println("1"); } takeLowTime = true; } if(digitalRead(pirPin) == LOW){ digitalWrite(ledPin, LOW); } if(!lockLow){ lockLow = true; Serial.print("0"); } }
Et voici mon Processing :
import processing.serial.*; Serial myPort; import processing.video.*; Movie myMovie; PImage pfc; String myString; int lf = 10; int val = 0; boolean CAPTEUR_ON = false; boolean MOVIE_PLAYING = true; void setup() { size(1680, 1050,P2D); myPort = new Serial(this, "/dev/cu.usbserial-0000101D", 9600); myPort.bufferUntil(lf); pfc = loadImage("photofc.jpg"); myMovie = new Movie(this, "Pou.mov"); myMovie.loop(); } void draw(){ background(0); if (CAPTEUR_ON == true) { loadImage("photofc.jpg"); image(pfc,0,0); } else { image(myMovie,0,0); } } void serialEvent(Serial myPort){ String myString = myPort.readStringUntil(lf); if(myString != null){ int val = int(myString); } if(val==0){ CAPTEUR_ON = false; myMovie.play(); MOVIE_PLAYING = true; } else{ CAPTEUR_ON = true; myMovie.pause(); MOVIE_PLAYING = false; } } void mousePressed() { myMovie.pause(); MOVIE_PLAYING = false; CAPTEUR_ON = true; } void mouseReleased() { CAPTEUR_ON = false; if (MOVIE_PLAYING == false) myMovie.play(); }
Je viens de passer quatre jours enfermée chez moi à bosser sur ce projet que je dois rendre mercredi si j'veux que mon installation soit exposée à Valence... J'en peu plus je comprends pas maintenant ce qu'il va pas... La vidéo tourne en boucle mais il n'y a aucune intéraction... Et je comprends pas pourquoi il faut laisser le void moussePressed et le voidmouseReleased ?? Bon point positif j'ai compris la première étape des variables dans Arduino !
Si tu avais encore un peu de temps pour me dire ce qu'il va pas ???!!!
D'avance j'te remercie...
Hors ligne
citation :
Et je comprends pas pourquoi il faut laisser le void moussePressed et le voidmouseReleased ??
Ce n'est pas nécessaire de les laisser, c'est uniquement pour tester l'interaction
Tu n'es pas loin du but mais ton problème vient probablement de la communication série, 2 choses à faire
1 - As tu vérifié dans l'environnement de programmation arduino que ton capteur envoyait les bonnes valeurs ? Pour ça tu peux utiliser le «Serial Monitor», il fonctionne comme un récepteur des données transmises par le port série et permet de vérifier que les bonnes données sont envoyées, une fois que tu es sure que ça fonctionne, tu peux le fermer et lancer ton sketch processing. (Pour ouvrir le serial monitor, dernier icône en bas à droite sur l'image ci-dessous). Choisis le bon port série dans Tools/Serial Port!
2 - Es tu sûre d'écouter sur le bon port série dans processing?
J'ai fait l'essai avec un interrupteur (je n'ai pas de capteur PIR) et le code suivant et ça marche, pour l'essayer tu devras changer le port série dans setup()
import processing.serial.*; int linefeed = 10; Serial myPort; import processing.video.*; Movie myMovie; PImage pfc; boolean CAPTEUR_ON = false; boolean MOVIE_PLAYING = true; void setup() { size(1000, 1000,P2D); println(Serial.list()); myPort = new Serial(this, Serial.list()[1], 9600); // myPort = new Serial(this, "/dev/cu.usbserial-0000101D", 9600); myPort.bufferUntil(linefeed); pfc = loadImage("photofc.jpg"); myMovie = new Movie(this, "Pou.mov"); myMovie.loop(); } void draw() { background(0); if (CAPTEUR_ON == true) { image(pfc,0,0); } else { image(myMovie,0,0); } } void serialEvent(Serial myPort) { String myString = myPort.readStringUntil(linefeed); if (myString != null) { myString = trim(myString); int val = int(myString); println("valeur transmise : " + val); if(val==0){ // si ce nombre vaut 0 (= OFF) CAPTEUR_ON = false; if (MOVIE_PLAYING == false) myMovie.play(); } else{ // si ce nombre vaut autre chose CAPTEUR_ON = true; myMovie.pause(); MOVIE_PLAYING = false; } } }
Hors ligne
J'ai simplifié le code arduino au maximum, il faudrait que tu testes ça pour voir si les données sont bien transmises sur le port série :
int calibrationTime = 30; int pirPin = 2; void setup(){ Serial.begin(9600); pinMode(pirPin, INPUT); for(int i = 0; i < calibrationTime; i++){ delay(1000); } digitalWrite(pirPin, LOW); } void loop(){ if(digitalRead(pirPin) == HIGH){ Serial.println("1"); } if(digitalRead(pirPin) == LOW){ Serial.print("0"); } delay(100); }
Hors ligne
YOUOUOUOUOUHOUOUOUO !!! Arduino et Processing se parlent !!! Milliones de gracias !!!
Reste un soucis : ce qui se passe c'est que la vidéo se lance en boucle jusqu'à ce que tu passes devant le capteur et qu'apparaisse la photo mais quand ma LED s'éteind (autrement dit quand mon capteur ne capte plus rien) la vidéo ne se relance pas... .
Maintenant que je commence à "comprendre" quelques trucs il semble y avoir besoin d'un système de boucle pour que le capteur, après avoir été déclenché une première fois et avoir fait exécuter ce que je lui ai dit de faire dans Processing, revienne en position "0" et reface passer la vidéo en boucle jusqu'à ce qu'il détecte 1 mouvement de nouveau...
Voilà mon Arduino
int calibrationTime = 30; int pirPin = 2; int ledPin = 13; void setup(){ Serial.begin(9600); pinMode(pirPin, INPUT); pinMode(ledPin, OUTPUT); for(int i = 0; i < calibrationTime; i++){ delay(1000); } digitalWrite(pirPin, LOW); } void loop(){ if(digitalRead(pirPin) == HIGH){ digitalWrite(ledPin, HIGH); Serial.println("1"); } if(digitalRead(pirPin) == LOW){ digitalWrite(ledPin, LOW); Serial.print("0"); } delay(100); }
Et voilà mon Processing :
import processing.serial.*; int linefeed = 10; int val = 0; Serial myPort; import processing.video.*; Movie myMovie; PImage pfc; boolean CAPTEUR_ON = false; boolean MOVIE_PLAYING = true; void setup() { size(1680, 1050,P2D); println(Serial.list()); myPort = new Serial(this, "/dev/cu.usbserial-0000101D", 9600); myPort.bufferUntil(linefeed); pfc = loadImage("photofc.jpg"); myMovie = new Movie(this, "Pou.mov"); myMovie.loop(); } void draw() { if (CAPTEUR_ON == true) { loadImage("photofc.jpg"); image(pfc,0,0); } else { background(0); image(myMovie,480,237); } } void serialEvent(Serial myPort) { String myString = myPort.readStringUntil(linefeed); if (myString != null) { myString = trim(myString); int val = int(myString); println("1" + val); if(val==0){ // si ce nombre vaut 0 (= OFF) CAPTEUR_ON = false; if (MOVIE_PLAYING == false) myMovie.loop(); } else{ // si ce nombre vaut autre chose CAPTEUR_ON = true; myMovie.pause(); MOVIE_PLAYING = false; } } }
Bon peut-être j'ai mal fait quelque chose encore même probablement !
Si (j'espère pour la dernière fois) tu avais encore un peu de ton génie à me transmettre...
En tout cas Merci beaucoup déjà pour tout ce que tu m'as appris !
Hors ligne
Bonjour,
citation :
Reste un soucis hmm : ce qui se passe c'est que la vidéo se lance en boucle jusqu'à ce que tu passes devant le capteur et qu'apparaisse la photo mais quand ma LED s'éteind (autrement dit quand mon capteur ne capte plus rien) la vidéo ne se relance pas...
Normalement, le code arduino dernière version ne permet pas d'allumer une led, tu es sûre d'avoir le bon code dans l'arduino ? Quand tu dis « la vidéo ne se relance pas » est ce que ça veut dire que l'image reste affichée ou que la vidéo reste figée ?
citation :
Maintenant que je commence à "comprendre" quelques trucs il semble y avoir besoin d'un système de boucle pour que le capteur, après avoir été déclenché une première fois et avoir fait exécuter ce que je lui ai dit de faire dans Processing, revienne en position "0" et reface passer la vidéo en boucle jusqu'à ce qu'il détecte 1 mouvement de nouveau...
Si personne ne passe devant le capteur, la vidéo tourne normalement en boucle (vérifies si tu n'en es pas sûre). Le capteur envoie t'il les bonnes valeurs ? (à vérifier, soit avec le serial monitor d'arduino, soit en regardant la sortie de la ligne « println("1" + val); » dans processing, d'ailleurs il faudrait plutot mettre « println(val); » pour afficher la valeur transmise par arduino. Dans le code actuel, la vidéo reprend là ou elle en était avant la pause, si tu veux la remettre au début, il y a des petits changements à faire.
Hors ligne
Salut !
B pour l'Arduino j'avais modifié un petit peu ce que tu m'avais écrit pour que j'ai ma LED témoin c'est plus pratique pour savoir si ça marche... Mais peut-être j'ai fait une erreur en le modifiant ? C'est pour ça je te l'avais remis dans le message précédent...
Mon problème est que l'image (la photo) reste affichée et la vidéo ne se relance pas. ça marche qu'une seule fois si tu préfère... Mais si tu attend avant de passer devant le capteur la vidéo est bien en boucle... Et par contre je veux que la vidéo reprenne là où elle s'est arrêté donc à ce niveau là pas trop de soucis.
Et j'ai changé le « println("1" + val) » par« println(val) » mais ça ne change rien à mon problème...
Hors ligne
Mary64 a écrit:
Et j'ai changé le « println("1" + val) » par« println(val) » mais ça ne change rien à mon problème...
C'est normal que ça ne change rien, c'est uniquement pour afficher la valeur transmise par arduino, ça te permet de voir les données reçues par le port série.
Il y a une erreur dans le code arduino, il faut mettre « Serial.println("0"); » et non pas « Serial.print("0"); », ce qui donne :
int calibrationTime = 30; int pirPin = 2; int ledPin = 13; void setup(){ Serial.begin(9600); pinMode(pirPin, INPUT); pinMode(ledPin, OUTPUT); for(int i = 0; i < calibrationTime; i++){ delay(1000); } digitalWrite(pirPin, LOW); } void loop(){ if(digitalRead(pirPin) == HIGH){ digitalWrite(ledPin, HIGH); Serial.println("1"); } if(digitalRead(pirPin) == LOW){ digitalWrite(ledPin, LOW); Serial.println("0"); } delay(100); }
Si ça ne marche toujours pas avec ça, regarde les valeurs reçues par processing et dis en un peu plus là-dessus, la vidéo se relance uniquement quand processing reçoit la valeur 0 d'arduino (dans « if(val==0){ ... » )
Hors ligne
Pages: 1 2