Os Testes e a avaliação da biblioteca SoftIIC foi efectuada no ambito do estudo das potencialidades e limites das soluções de comunicação entre microcontroladores disponiveis no Arduino.
Biblioteca SoftIIC
https://github.com/cirthix/SoftIIC
A biblioteca não tem muitas informações em como ser usada. Tive que procurar no código da biblioteca para a por funcionar.
A biblioteca SoftIIC foi testada com com os seguintes objectivos:
- Criar um slave num segundo bus;
- Usar menos memória nos Arduinos slaves
O principal objectivo é a partir de um Arduino bus master no I2C normal com a biblioteca Wire poder comunicar com outro Arduino configurado como I2C slave com a biblioteca TinyWire Slave, num bus I2C em pinos alternativos aos normais do I2C, que ao mesmo tempo é master no bus I2C dos pinos SDA e SCL nos pinos normais do Arduino, usando a biblioteca Wire nesse bus, para ler um sensor de distancia com interface I2C.
O i2c_scanner conseguir detectar o slave. Os testes foram demorados até chegar a uma conclusão, pois os exemplos não funcionaram.
Nunca consegui por a funcionar o exemplo MPU6050_MPU da biblioteca do jrowberg a funcionar, com o bus normal do Arduino1 ligado ao Arduino2 no seu bus I2C secundário.
Mas sem o MPU6050 activo consegui colocar a funcionar um setup estável. Que consegue enviar 32 bytes, em requests de 30 em 30ms, com perda integral dos dados de alguns requests, mas com integridade dos que são recebidos.
Esta solução foi só de software não coloquei nenhumas resistências pull up.
Relativamente à memória parece que consome mais memória de programa e menos memória de variáveis.
Apesar de não ter conseguido um exito absoluto, parece-me que esta bibilioteca possa ser uma solução de duplo bus i2c aceitavel para alguns projectos. Pelo menos desde que não envolvam o MPU6050.
Destaques
Pelo que percebi usa o Timer1 e requer dois pinos I/O pinos na mesma porta.
Ou sejas os pinos escolhidos tem de pertencer á mesma porta, conforme seguintes os grupos:
- B pinos digital de 8 a 13
- C pinos analógicos
- D pinos digital de 0 a 7
Os dois exemplos desactivam os interrupts com noInterrupts();. Mas nos meus testes não vi grande diferença no comportamento.
Slave no segundo bus
O Arduino a correr programa exemplo slave foi detectado pelo i2c_scanner.
Scanning... I2C device found at address 0x50 ! I2C device found at address 0x51 ! I2C device found at address 0x68 ! done
Mas não foi detectado I2CScanSlow.
Uso de memória (prg/var)
Dados dos exemplos incluidos
- Master – 5444 / 253 bytes
- Slave – 4256 / 249 bytes
Software exemplo incluido
A biblioteca vem com dois exemplos incluidos:
- SoftIIC_example_master
- SoftIIC_example_slave
Nos exemplos a declaração inicial está mal. É a seguinte:
SoftIIC my_SoftIIC = SoftIIC(SCL_PIN, SDA_PIN, true, IIC_SPEED, true);
Têm de ser trocado para a seguinte:
SoftIIC my_SoftIIC = SoftIIC(SCL_PIN, SDA_PIN, IIC_SPEED, true, true, true);
Conjunto de testes 1
Foram efectuados várias testes, de modo a avaliar o comportamento de soluções baseadas nesta biblioteca.
Hardware
- Arduino Nano 328P
- Arduino Nano 168
- Sensor de distância VL53L0X
- Acelerómetro e Giróscópio MPU6050
Software
Notas
Os pares de pinos SDA, SCL usados nos vários testes foram os: A0 e A1, 2 e 3, e 8 e 9. Os pinos escolhidos respeitavam o requisito de estar no mesmo PORT.
Modifiquei o código do slave para piscar o led interno, em cada comando que o slave recebia. O slave pisca o led, o que significa que processa os comandos.
Teste aos exemplos
Depois de carregar os exemplos de slave e master para cada um dos Arduinos infelizmente conclui que por alguma razão nao funcionava.
Teste a compatibilidade remota com a biblioteca wire
Também fiz um master com a biblioteca Wire, para tentar ler algum valor do slave a correr o exemplo de slave. Obtive sucesso. É possivel comunicar com slave com a TinyWire a partir de um master com a biblioteca Wire. Neste teste modifiquei o códido do slave para enviar ou o valor 253 ou o 254, consoante o endereço do bus fosse o 50 ou o 51.
Teste a compatibilidade local com a biblioteca wire
Foi feito um programa que integrava a leitura do VL53L0X com o exemplo do slave incluido na biblioteca, já com as alterações do led.
Como o led nunca piscava, conclui que o Arduino slave a correr o programa não era executado correctamente. Para o programa do slave funcionar com o VL53L0X foi preciso retirar a chamada a noInterrupts() do setup(). Mais tarde modifiquei o programa para enviar um byte da leitura do sensor, o loop counter, e o looptime. Este setup foi estavel, com algumas perdas de dados, ou seja requests sem resposta, mas com respostas totais e integras, para 32 bytes, com delays de 30ms.