Buonasera a tutti, mi chiamo Tommaso e vorrei realizzare un progetto basato sul protocollo i2c.
In particolare ho usato due schede Arduino (mega 2560 come master e uno come slave),
lo slave si occupa di "leggere" dei valori PWM (durata del livello logico alto in micro secondi) da una ricevente rc e spedirli al master mediante i2c.
Per adesso il master dovrebbe riceve i valori e visualizzarli sul monitor seriale (successivamente i dati dovranno essere elaborati).
Ma invece di stampare la durata leggo ad esempio "80 255" e modificando la posizione del potenziometro sulla trasmittente rc varia soltanto il primo dei due numeri.
Come riferimento ho usato la seguente guida: https://www.arduino.cc/en/Tutorial/MasterReader .
Allego il codice caricato sulle schede.
Master (mega 2560)
#include <Wire.h>
void setup() {
Wire.begin(); // join i2c bus (address optional for master)
Serial.begin(9600); // start serial for output
}
void loop() {
Wire.requestFrom(8, 2); // request 6 bytes from slave device #8
while (Wire.available()) { // slave may send less than requested
uint16_t c = Wire.read(); // receive a byte as character
Serial.println(c); // print the character
}
delay(500);
}
Slave (uno )
#include <EnableInterrupt.h>
#include <Wire.h>
#define SERIAL_PORT_SPEED 57600
#define RC_NUM_CHANNELS 2
#define RC_CH1 0
#define RC_CH2 1
#define RC_CH1_INPUT A0
#define RC_CH2_INPUT A1
uint16_t rc_values[RC_NUM_CHANNELS];
uint32_t rc_start[RC_NUM_CHANNELS];
volatile uint16_t rc_shared[RC_NUM_CHANNELS];
void rc_read_values() {
noInterrupts();
memcpy(rc_values, (const void *)rc_shared, sizeof(rc_shared));
interrupts();
}
void calc_input(uint8_t channel, uint8_t input_pin) {
if (digitalRead(input_pin) == HIGH) {
rc_start[channel] = micros();
} else {
uint16_t rc_compare = (uint16_t)(micros() - rc_start[channel]);
rc_shared[channel] = rc_compare;
}
}
void calc_ch1() { calc_input(RC_CH1, RC_CH1_INPUT); }
void calc_ch2() { calc_input(RC_CH2, RC_CH2_INPUT); }
void setup() {
Serial.begin(SERIAL_PORT_SPEED);
pinMode(RC_CH1_INPUT, INPUT);
pinMode(RC_CH2_INPUT, INPUT);
Wire.begin(8); // join i2c bus with address #8
Wire.onRequest(requestEvent); // register event
enableInterrupt(RC_CH1_INPUT, calc_ch1, CHANGE);
enableInterrupt(RC_CH2_INPUT, calc_ch2, CHANGE);
}
void loop() {
rc_read_values();
//Serial.print("CH1:"); Serial.print(rc_values[RC_CH1]); Serial.print("\t");
// Serial.print("CH2:"); Serial.print(rc_values[RC_CH2]); Serial.print("\t");
delay(200);
}
void requestEvent() {
Wire.write(rc_values[RC_CH1]); // respond with message of 6 bytes
// as expected by master
}
Qualche idea su come riuscire a visualizzare correttamente l'output?
Grazie in anticipo, Tommaso.