Software desenvolvido para a análise descrita no artigo Testes e avaliação da biblioteca SoftIIC, no ambito da exploração das interfaces disponiveis no Arduino para comunicação entre microcontroladores.
Neste programa, face ao anterior, foi adicionada a leitura do sensor de distância VL53L0X usando a biblioteca da Pololu que usa a biblioteca Wire.
Hardware
- Arduino1 – Nano 328P + MPU6050 (bus I2C normal)
- Arduino2 – Nano 168 + VL53L0X (bus I2C normal)
O Arduino1 liga-se no bus I2C normal ao bus I2C secundário do Arduino2.
O programas master associado a este é:
Este programa deve ser executado no Arduino2.
SoftIIC_example_slave2
#include <Wire.h> #include <VL53L0X.h> VL53L0X sensor; #include <avr/pgmspace.h> #include <SoftIIC.h> // Note: these can be *any* pins, not just a4/a5. #define SDA_PIN A1 #define SCL_PIN A0 #define SERIAL_PORT_SPEED 115200 #define IIC_SPEED 50 static uint8_t current_register_address_for_50 = 0x00; static uint8_t current_register_address_for_51 = 0x00; static uint8_t current_register_address_for_52 = 0x00; PROGMEM const uint8_t MY_VIRTUAL_EEPROM50[] = {0x00, 0x0F, 0x01, 0x02, 0x03, 0xab}; PROGMEM const uint8_t MY_VIRTUAL_EEPROM51[] = {0xF0, 0xFF, 0xF1, 0xAA, 0x09, 0xa4}; SoftIIC my_SoftIIC = SoftIIC(SCL_PIN, SDA_PIN, IIC_SPEED, true, true, true); boolean ledState = false; int distance = 0; unsigned long loopTimeStart; byte loopTime; byte loopCount; void setup() { Serial.begin(SERIAL_PORT_SPEED); Wire.begin(); sensor.init(); sensor.setTimeout(500); sensor.startContinuous(); //noInterrupts(); pinMode(LED_BUILTIN, OUTPUT); loopTimeStart = millis(); } void loop() { // Last, act as A 24c04 eeprom (read-only) slave uint8_t successful_bytes = 0; uint16_t TOTAL_EXPECTED_BYTES = 512; //while (successful_bytes < TOTAL_EXPECTED_BYTES) { distance = sensor.readRangeContinuousMillimeters() / 100; successful_bytes = successful_bytes + my_SoftIIC.SlaveHandleTransaction(respond_to_address, respond_to_command, respond_to_data, get_current_register_address, set_current_register_address, read_iic_slave, write_iic_slave); loopCount++; loopTime = millis() - loopTimeStart; loopTimeStart = millis(); //} } //////////////////////////////////////////////////////////// These functions should be edited to give the iic slave a 'personality'. //////////////////////////////////////////////////////////////// uint8_t virtualeeprom(uint8_t chipaddress, uint8_t registeraddress) { uint8_t retval = 0xFF; //if (chipaddress == 0x50 && registeraddress < (sizeof(MY_VIRTUAL_EEPROM50) / sizeof(uint8_t))) { retval = pgm_read_byte_near(MY_VIRTUAL_EEPROM50 + registeraddress); } //if (chipaddress == 0x51 && registeraddress < (sizeof(MY_VIRTUAL_EEPROM51) / sizeof(uint8_t))) { retval = pgm_read_byte_near(MY_VIRTUAL_EEPROM51 + registeraddress); } if(chipaddress == 0x50) { retval = loopCount; } if(chipaddress == 0x51) { retval = distance; } if(chipaddress == 0x52) { retval = loopTime; } return retval; } uint8_t respond_to_address(uint8_t chipaddr){ if((chipaddr>>1)==0x50) { ledState = !ledState; digitalWrite(LED_BUILTIN, ledState); return 0x01; } if((chipaddr>>1)==0x51) { ledState = !ledState; digitalWrite(LED_BUILTIN, ledState); return 0x01; } if((chipaddr>>1)==0x52) { ledState = !ledState; digitalWrite(LED_BUILTIN, ledState); return 0x01; } return 0x00; } uint8_t respond_to_command(uint8_t commandaddr){ ledState = !ledState; digitalWrite(LED_BUILTIN, ledState); return 0x01; } uint8_t respond_to_data(uint8_t commandaddr){ ledState = !ledState; digitalWrite(LED_BUILTIN, ledState); return 0x01; } uint8_t get_current_register_address(uint8_t chipaddr) { if (chipaddr == 0x50) { return current_register_address_for_50; } if (chipaddr == 0x51) { return current_register_address_for_51; } if (chipaddr == 0x52) { return current_register_address_for_52; } return 0x00; } uint8_t set_current_register_address(uint8_t chipaddr, uint8_t regaddr) { if (chipaddr == 0x50) { current_register_address_for_50 = regaddr; } if (chipaddr == 0x51) { current_register_address_for_51 = regaddr; } if (chipaddr == 0x51) { current_register_address_for_52 = regaddr; } return 0x00; } uint8_t read_iic_slave(uint8_t chipaddress, uint8_t* value) { uint8_t registeraddress = get_current_register_address(chipaddress); *value = virtualeeprom( chipaddress, registeraddress); return 0x00; } uint8_t write_iic_slave(uint8_t chipaddr, uint8_t value) { // Don't do anything with writes for this demo. return 0x00; }