Led di prossimità

Ciao a tutti , sono iscritto da poco , intanto vi ringrazio perchè leggendo ho trovato molti consigli utili .
Non so se sto scrivendo nel posto giusto , spero di si ...
Vorrei chiedervi un consiglio per aggiungere dei sensori a led di prossimita'(MH Sensor-Series Flying-Fish) sul mio giocattolino , e ho provato a collegarli in analogico . Sto usando una uno con sopra la Shield Motor v1,2 ,dove ho gia collegato 4 motori dc ,1 servo e usando A4 e A5 come pin digitali il sensore ultrasuoni.
Quindi non sapendo piu dove attaccarli ho pensato all'analogico.

int analogPin1 = A0;
int analogPin2 = A1;
int analogLed1 = A2;
int analogLed2 = A3;

int pss=0;
int psd=0;
int lrs=0;
int lvd=0;

void setup() {
  Serial.begin(9600);
  
}

void loop() {
  
  pss = analogRead(analogPin1);
  if (pss < 150) {
  analogWrite(analogLed1, lrs=200);
  Serial.print("pss: ");
  Serial.println(pss);}

  else {
    analogWrite(analogLed1, lrs=0);
    Serial.print("pss: ");
    Serial.println(pss);
  }

  psd = analogRead(analogPin2);
  if (psd < 150){
  analogWrite(analogLed2, lvd=200);  
    Serial.print("psd: ");
    Serial.println(psd);}

  else {
    analogWrite(analogLed2, lvd=0);
    Serial.print("psd: ");
    Serial.println(psd);
  }

}

non mi prendete in giro sono base base sulla programmazione .
pero il sistema funzionerebbe , ma non so quanto possa essere sicura (parliamo sempre di un giocattolo) nel funzionamento

... sarò un po' cecato io, ma nel codice messo non vedo l'uso di A4 ed A5 :roll_eyes:

Guglielmo

questo è solo il codice della prova sui sensori di prossimità ,solo per leggere che valori davano sia da aperti e chiusi .
poi dovrò aggiungerli al codice che comanda il giocattolo .
ma la domanda era se potrebbero funzionare cosi .

... Cosa? I due pin A4 ed A5?

Se è questo che chiedi, SI. In realtà, i pin analogici della UNO sono tutti anche pin digitali; in particolare A4 = pin digitale 18 ed A5 = pin digitale 19 quindi usare A4 ed A5 o usare 18 e 19 è la stessa cosa.

Guglielmo

Scusami ora ti sei fissato sui pin A4 e A5 ma quelli non ci sono perchè funzionano benissimo ,
quello che intendevo era se i valori analogici che mi arrivano da questo collegamento posso essere stabili per il funzionamento o possono avere variazioni .
Comunque ho riguardato il pinout della uno e pensavo che solo il 4 e 5 si potessero usare in digitale , invece anche gli altri, perdono solo delle funzione che nel mio caso sono irrilevanti .
Grazie della pazienza , a questo punto meglio lo riscrivo in digital e sicuramente mi rimane piu facile aggiungerlo al resto del codice .
Grazie ancora per voi sono cose banali , ma per me sono ore di ricerche e letture
è stato un piacere guglielmo
Alfredo

Molto meglio direi anche io.
Se ti può essere di aiuto qui c'è il riassunto sulla UNO.

Ciao.

Grazie Mauro , a questo punto se mi funziona anche il sensore ultrasuoni mi libero pure A4-A5 per eventuali moduli i2c se un giorno riusciro' a farli funzionare :rofl:

Beh ... completiamo con un classico sempre utile ... pinout diagramm unov3pdf.pdf (812.6 KB)

Guglielmo

Come ad esempio LCD I2C come connesso in questo simulatore.

PS: non è richiesta iscrizione.

Ciao.

Guglielmo questo l'ho stampato e sta qua sempre davanti i miei occhi , ma qui si capisce meglio il fatto dei pin digitali

io ho quello del kit credo serve un modulo per collegarlo in i2c..
oddio bellissimo l'ho capito dopo che era un simulatore ...
Sono un po lento :rofl: :joy: :shushing_face:

Bello anche quello :slight_smile:

Guglielmo

analogWrite si può fare solo sui pin segnati come PWM!

Sembra di no , il codice è funzionante .

Non "sembra", È COSÌ ... la analogWrite(), che di analog in realtà non ha nulla visto che attiva solo il PWM su alcuni pin, ovviamente funziona come dovrebbe funzionare SOLO sui pin che possono generare un segnale PWM ovvvero collegati alle uscite di determinati Timer della MCU ...

... nel caso di Arduino UNO abbiamo:

  • Timer0 ha il compito di generare un PWM a 976.5625 Hz sui pin 5 e 6
  • Timer1 ha il compito di generare un PWM a 488.28125 Hz sui pin 9 e 10
  • Timer2 ha il compito di generare un PWM a 488.28125 Hz sui pin 3 e 11

... dato che è un collegamento interno della MCU non è che lo puoi variare come ti pare, i pin che sono in grado di fare il vero PWM sono solo quelli.

Guglielmo

Guglielmo io non ho le conoscenze per risponderti , posso dire che per la prova che avevo fatto usando i valori che mi leggeva il pin , riuscivo a gestire il pin di uscita per quello che avrei dovuto fare .
Comunque adesso l'ho riscritto in digital non funziona più sui valori letti ma sullo stato del sensore .

const int SP1 = A0;
const int SP2 = A1;

#define L1  A2
#define L2  A3


void setup() {
  Serial.begin(9600);
  
pinMode (SP1, INPUT);
pinMode (SP2, INPUT);
pinMode (L1, OUTPUT);
pinMode (L2, OUTPUT);
}
 
void loop() {
  
  if (digitalRead (SP1)==HIGH) { 
  digitalWrite(L1, LOW);
  Serial.print("pss: ");
  Serial.println(SP1); }

  else {
    digitalWrite(L1, HIGH);
    Serial.print("pss: ");
    Serial.println(SP1);
  }

  if (digitalRead(SP2)==HIGH) {
  digitalWrite(L2, LOW);  
    Serial.print("psd: ");
    Serial.println(SP2); }

  else {
    digitalWrite(L2, HIGH);
    
    Serial.print("psd: ");
    Serial.println(SP2);}
  }

... ti spiego perché a te sembrava funzionasse :wink: ... la analogWrire() è una funzione che è implementata in "wiring_analog.c" del "core" Arduino.

Se si vanno a leggere i sorgenti si vede che, come prima cosa cerca di capire che pin PWM stai usando e quindi di attivare il relativo Timer, alla fine, se si accorge che il pin indicato NON è un pin con capacità PWM, comunque qualche cosa di molto semplice fa ... ci troviamo all'interno di uno switch/case che verifica i vari times e, alla fine:

			case NOT_ON_TIMER:
			default:
				if (val < 128) {
					digitalWrite(pin, LOW);
				} else {
					digitalWrite(pin, HIGH);
				}

Quindi, se vede che stai usando pin che NON possono fare il PWM decide che, se il valore che passi alla funzione è inferiore a 128, il pin viene messo LOW, altrimenti il pin viene messo HIGH. Per questo può dare l'impressione di funzionare, ma, in realtà, fa solo un ON/OFF e non una variazione del segnale PWM :wink:

Guglielmo

In effetti questa è equivalente a digitalWrite.
lrs=200 è una assegnazione è il risultato di una assegnazione è true cioè vero equivalente a qualunque valore diverso da zero.

La funzione analogWrite() funziona solo sui pin con scritta PWM su sfondo rosa, con riferimento alla tua pinout.

Ciao.

In realtà, come ho descritto sopra, qualche cosa fa anche su tutti gli altri pin digitali di I/O, ma ... non certo un PWM :grin:

Guglielmo

è un po' come un while (1==1) {} o while (1) {}, condizioni intrinsecamente vere.

Certo, però, che sarebbe più utile che un analogWrite su un pin che non può fare PWM producesse un errore, perché è evidente che non è stato scritto di proposito! Almeno produce un warning?

Ho provato: neanche! :frowning: