firmata arduino processing irremote, togliere cavallotto

spero sia il forum giusto :relaxed:
riesco a far funzionare il telecomando con Firmata e Processing facendo un cavallotto che dall’uscita digitale 9 di arduino rientra in A2,

non c’e modo di fare che nel caso che il D9 sia alto …fai ?
il tutto funziona ma voglio togliere il cavallotto :sweat_smile:

questo { lo sketch di Processing, il bottone virtuale entra e esce accendendo un rele sia col telecomando sia con il mouse,
in un commento si capisce dove deve essere modificato

import processing.serial.*;

import cc.arduino.*;

Arduino arduino;
PImage prova, ciao;
color off = color(50);
color on = color(255);
int stato =0;


void setup() {
  size(1000, 1000, P3D);
  smooth();
  prova = loadImage ("Immagines 078.gif"); 
  ciao = loadImage ("Immagine.gif");
  prova.resize(width, height);
  println(Arduino.list());
  arduino = new Arduino(this, Arduino.list()[2], 57600);

  // arduino.pinMode(9, Arduino.OUTPUT);
  // arduino.pinMode(11, Arduino.OUTPUT);
}

void draw() {

  background(prova);

  stroke(on);

  // for (int i = 0; i <= 13; i++) {
  if (arduino.analogRead(2)>= 512) {    // cavallotto tra D9 a A2
    noStroke();
    fill(on);
    rect( 60, 80, 30, 5); 

    stroke(60);
    strokeWeight (3);
    fill(200, 200, 200);
    ellipse (55, 33, 50, 50); 
    image (ciao, 30, 10, 50, 50);
    image(ciao, 30, 11, 50, 50);
    // stato = 1;
  } 
  else {
    stroke(60);
    strokeWeight (3);
    fill(200, 200, 200);
    ellipse (875* 60, 33, 50, 50);    

    image(ciao, 30, 11, 50, 50);
    image(ciao, 30, 12, 50, 50);
    image(ciao, 30, 13, 50, 50);
    image(ciao, 30, 14, 50, 50);   
    image(ciao, 30, 15, 50, 50);     
    image(ciao, 30, 16, 50, 50);
    image(ciao, 30, 17, 50, 50);   
    image(ciao, 30, 18, 50, 50);  


    noStroke();
    fill(off);

    rect(60, 80, 30, 5);
    //stato =0;
  }
}
//}

void mousePressed()
{
  if ( mouseX >10 && mouseX < 100 && stato ==0) {

    arduino.digitalWrite(11, Arduino.HIGH);
    arduino.digitalWrite(9, Arduino.HIGH);
    stato = 1;
  } 
  else if ( mouseX >10 && mouseX < 100 && stato ==1) {
    arduino.digitalWrite(11, Arduino.LOW);
    arduino.digitalWrite(9, Arduino.LOW);
    stato =0;
  }
}

grazie

Tra poco seguiranno interventi alla supercazzola, ne sei cosciente vero? :D

Usando google traduttore dal Klingon all'Italiano ho capito che il tutto ti funziona se hai il "cavallotto". Se è così la soluzione ce l'hai sotto gli occhi e l'hai pure commentata:

if (arduino.analogRead(2)>= 512) {    // cavallotto tra D9 a A2

si, mi sono spiegato male,

if (arduino.analogRead(2)>= 512) {    // cavallotto tra D9 a A2

analogRead(2) prende il segnale da pin digitale (9), questo collegamento l'ho fatto perchè non riesco a dire al programma, al posto di analogRead(2)>= 512 (alto o basso 0-1023)

ad esempio: digitalRead (9) == 1; oppure digitalRead (9) == HIGH;

non funziona. siccome devo mettere 4 pulsanti ed altro,se metto i cavallotti, i pin non mi bastano . la soluzione potrebbe essere semplice ma non ci arrivo

Puoi risolverlo cambiando la riga incriminata con questa :D

if (1+2==3) {

e togli il "cavallotto"

edit Ho cercato di rileggere tutto e forse ho capito cosa vuoi fare... :roll_eyes: Così leggi se il valore della porta x (nel tuo caso 9) è HIGH

if (arduino.digitalRead(9) == Arduino.HIGH) {

in effetti è strana e difficile da spiegare, anche perchè non credo si veda tutti i giorni un collegamento diretto tra pin digitale e analogico,

quello che mi proponi lo avevo gia provato prima di trovare la soluzione del cavalloto, ora ho riprovato ma non funziona. :~

forse pretendo di leggere un segnale in uscita con digitalRead che forse serve per leggere solo segnali in entrata(?), provato anche con digitalWrite...

scusa se dico cavolate ma è da pochi mesi che ho scoperto arduino e la programmazione.

pighixxx grazie per avermi risposto

riformulo il tutto…
-Arduino
-Processing
-Firmata
-irRemote

ho fatto un programma con Processing,
un tasto tridimensionale premuto con il Mouse va a scomparsa,
nel frattempo un rettangolo da nero diventa bianco, indicando l’avvenuta accensione del rele collegato ad arduino.
e fin qui ok.

ho voluto aggiungere il telecomando, un vecchio Philips RC6, il ricevitore è un TSOP.
fatto lo sketch normale per “arduino”, il quale , con il tasto “1” del telecomando mette in alto l’uscita digitale 11,
con il tasto “2” mette in alto l’uscita digitale 7…ecc…

detto sketch devo farlo parlare con Processing tramite Firmata,

non trovando nulla in rete da prendere spunto, ho provato banalmente a mettere nella libreria "standardFirmata lo sketch del telecomando,
ognuna delle sue parti evidentemente nella giusta posizione, la parte di Setup nel Setup, quella del Loop nel Loop ecc…

miracolosamente una volta caricato il nuovo “StandardFirmata”, il telecomando comanda arduino accendendo il rele, processing comanda arduino indipendentemente accendendo lo stesso rele…ok,

ora devo fare che se con il telecomando accendo il rele, il pulsante disegnato di Processing entri a scomparsa e metta il rettangolo da nero a bianco (quello che fa con il mouse).

mi sono detto semplice… con il telecomando oltre al pin rele metto il pin “9” alto e dico a processing quando il pin 9 è alto fammi entrare il pulsante…

ecco, non funziona,
poi se faccio un cavallotto dal pin 9 al pin A2 e dico a Processing quando il pin A2 è alto fammi entrare il pulsante…funziona correttamente.

come posso fare per dire a Processing quando il pin digitale “9” in uscita è alto di fare quello che deve fare?

if (arduino.digitalRead(9) == Arduino.HIGH) { (non funziona)

----> cavallotto dal (9) a (A2)------>

if (arduino.analogRead(2) > 512) { (FUNZIONA)

Guarda mi sto sforzando di capire ma dal codice che hai postato non c'è nessuna lettura di un ricevitore IR. Ricapitoliamo così vediamo se riusciamo a darti una mano:

-Schema che stai utilizzando -Piattaforma che stai utilizzando (Suppongo Processing) -Codice completo che stai utilizzando -Quello che deve fare più o meno l'ho capito

Posta con ordine quello che ti ho chiesto che vediamo di trovare una soluzione.

-Processing 1.5.1 (con il 2 Firmata non mi funziona)
-Firmata ( StandardFirmata) lo sketch (libreria) che carico su arduino per far comunicare arduino con Processing, non posso carricare un secondo sketch…
-irRemote la libreria per far funzionare i classici telecomandi da televisore.

sketch per telecomando:

#include <IRremote.h>
int statu=0;
int stata=0;
int RECV_PIN = A0;
IRrecv irrecv(RECV_PIN);
decode_results results;

void setup()
{
  pinMode(11, OUTPUT);
  pinMode(10, OUTPUT);
  pinMode(9, OUTPUT);
  pinMode(6, OUTPUT);
  //Serial.begin(9600);
  irrecv.enableIRIn(); // Start the receiver
  irrecv.blink13(true);
}

void loop() {
  if (irrecv.decode(&results)) {
    Serial.println(results.value);

    if((results.value == 1 )&& (stata ==0) or (results.value == 65537) && (stata ==0)){ 

      digitalWrite(11, HIGH);
      digitalWrite(9, HIGH);
      stata=1;
      delay (400); 
    }

    else if((results.value == 1)&& (stata==1) or (results.value == 65537) && (stata==1)){ 
      //stato = "spento";
      digitalWrite(11, LOW);
      digitalWrite(9, LOW);
      stata = 0;
      delay (400); 
    }
    if((results.value == 2 )&& (statu ==0) or (results.value == 65538) && (statu ==0)){ 

      digitalWrite(10, HIGH);
      digitalWrite(6, HIGH);
      statu=1;
      delay (400); 
    }

    else if((results.value == 2)&& (statu==1) or (results.value == 65538) && (statu==1)){ 
      //stato = "spento";
      digitalWrite(10, LOW);
      digitalWrite(6, LOW);
      statu = 0;
      delay (400); 
    }
   
   
    irrecv.resume(); // Receive the next value
  }
}

questo sketch lo ho copiato all’interno di “StandardFirmata” le varie parti (non tutte) nelle relative posizioni, e aggiunto la libreria “IrRemote”,
caricato “StandardFirmata modificato” il telecomando funziona regolarmente con arduino

if((results.value == 1 )&& (stata ==0) or (results.value == 65537) && (stata ==0)){ ( il mio telecomando “RC6” il tasto 1 da alcune volte 1 e altre volte 65537, lo si vede da serial monitor)

non posto “standardFirmata” perchè è enorme e lo si trova facilmente

riposto lo sketch di processing:

import processing.serial.*;

import cc.arduino.*;

Arduino arduino;
PImage prova, ciao;
color off = color(50);
color on = color(255);
int stato =0;


void setup() {
  size(1000, 1000, P3D);
  smooth();
  prova = loadImage ("Immagines 078.gif"); 
  ciao = loadImage ("Immagine.gif");
  prova.resize(width, height);
  println(Arduino.list());
  arduino = new Arduino(this, Arduino.list()[2], 57600);

  // arduino.pinMode(9, Arduino.OUTPUT);
  // arduino.pinMode(11, Arduino.OUTPUT);
}

void draw() {

  background(prova);

  stroke(on);

  // for (int i = 0; i <= 13; i++) {
  if (arduino.analogRead(2)>= 512) {    // cavallotto tra D9 a A2
    noStroke();
    fill(on);
    rect( 60, 80, 30, 5); 

    stroke(60);
    strokeWeight (3);
    fill(200, 200, 200);
    ellipse (55, 33, 50, 50); 
    image (ciao, 30, 10, 50, 50);
    image(ciao, 30, 11, 50, 50);
    // stato = 1;
  } 
  else {
    stroke(60);
    strokeWeight (3);
    fill(200, 200, 200);
    ellipse (875* 60, 33, 50, 50);    

    image(ciao, 30, 11, 50, 50);
    image(ciao, 30, 12, 50, 50);
    image(ciao, 30, 13, 50, 50);
    image(ciao, 30, 14, 50, 50);   
    image(ciao, 30, 15, 50, 50);     
    image(ciao, 30, 16, 50, 50);
    image(ciao, 30, 17, 50, 50);   
    image(ciao, 30, 18, 50, 50);  


    noStroke();
    fill(off);

    rect(60, 80, 30, 5);
    //stato =0;
  }
}
//}

void mousePressed()
{
  if ( mouseX >10 && mouseX < 100 && stato ==0) {

    arduino.digitalWrite(11, Arduino.HIGH);
    arduino.digitalWrite(9, Arduino.HIGH);
    stato = 1;
  } 
  else if ( mouseX >10 && mouseX < 100 && stato ==1) {
    arduino.digitalWrite(11, Arduino.LOW);
    arduino.digitalWrite(9, Arduino.LOW);
    stato =0;
  }
}

lo schema,
arduino UNO
tsop ricevitore telecomando al pin A0
rele uscita digitale 11
cavallotto da D9 a A2

non c’è altro

A me sembra strano questo: if (arduino.digitalRead(9) == Arduino.HIGH) { (non funziona)

Avrei un suggerimento diverso. Il Firmata non è altro che uno sketch che comunica a Processing attraverso la seriale, secondo comandi stabiliti da chi ha creato questo Firmata. Perchè non usare SOLO lo sketch del telecomando+gestione relè) e dentro ci metti la spedizione di comandi su seriale a Processing?

if((results.value == 1 )&& (stata ==0) or (results.value == 65537) && (stata ==0)){ 
      digitalWrite(11, HIGH);
      digitalWrite(9, HIGH);
      stata=1;
      Serial.print("R1");   // comando a processing   R1=on    R0=off
      delay (400); 
    }

Poi da Processing leggi la seriale e vedi che comandi arrivano (R1 o R0)

grazie anche a te,

vorrei riuscire a farlo con Firmata perchè ho altri ingressi/uscite da utilizzare inserendo sensori ecc.. e senza Firmata è complicato. =(

sono arrivato a questo punto: StandardFirmata NON permette di leggere lo stato dei pin digitali SimpleDigitalFirmata permette di leggere lo stato dei pin digitali

inserito in SimpleDigitalFirmata lo sketch del telecomando irRemote e il tutto funziona :) :) :)

ora però non funziona la parte analogica che devo aggiungere =(

penso di aver risolto.. un'altra domanda forse ot, devo aggiungere ancora 4 bottoni virtuali e 5 temperature, secondo voi arduino e processing ce la fanno o sto richiedendo un po troppo? lo chiedo perchè gia ora se scaldo il sensore temperatura velocemente processing si blocca, mentre se la temperatura si alza e si abbassa normalmente piano piano processing non si blocca