Extensión para Mblock para gestionar dispositivos a través del bus i2c.
Permite operaciones sencillas de lectura y escritura de 1 registro completo cada vez a través de este bus.
Existen algunas extensiones para gestionar algunos dispositivos i2c especificos, pero si tu dispositivo difiere en algo del estandar o necesitas un contacto directo o simple, yo no he podido encontrar nada que ayude.
No he podido encontrar suficiente información para hacer una extensión completa que funcione en el modo online del Mblock asi que lo dejo en utilizable en modo arduino y si alguien quiere completarlo, por favor, dígamelo y le ayudaré tanto como pueda.
Descripción de funcionamiento:
Bloque de escritura:
Sus parámetros son la dirección i2c del dispositivo (en código decimal. Ej.: para un dispositivo con dirección hexadecimal “0x0D” habrá que poner “13”). La dirección o byte de registro en la que queremos escribir (también en decimal) y a continuación el byte completo del dato que queremos enviar.
Bloque de lectura:
Sólo habrá que introducir la dirección i2c del dispositivo en decimal y el número de registro o byte que queremos leer. Devolverá el valor en decimal de byte requerido.
Pongo aquí el código comentado con las cosas que he averiguado de como hacer extensiones.
/* // content of i2cEXT.s2e */ { "extensionName": "I2C Manage", "description": "Extension for manage i2c bus devices (Arduino only)", "version": "0.5", "author": "Isaac Sanchez(saki@asako.org)", "homepage": "https://github.com/Isk34/i2cEXT", "sort":0, "javascriptURL":"js/I2Cext.js", "firmware":"1.0", "extensionPort":0,
La información de cabecera no necesita mucho comentario. La versión es importante si al desarrollar modificaciones es donde nos dice si hay que instalarlas o no, sobre todo si lo ponemos online. El contacto del autor no lo gestiona bien, en la administración de extensiones del Mblock parece que la @ fastidia el enlace y sólo aparece el dominio.
"blockSpecs": [ [ "w","Write-I2C(BaseAddr: %n, RegAddr: %n, Data: %n )","WriteI2C","0","0","0", { "setup":"Wire.begin();\n \n", "inc":" ", "def":" ", "work":" Wire.beginTransmission({0}); //start talking\ Wire.write({1}); // Set the Register\ Wire.write({2}); // Set the data\ Wire.endTransmission();\ \n", "loop":"" } ],
Hasta aquí se define el bloque de escritura. La presencia de las 5 secciones parece imprescindible, si falta alguna de ellas se producen errores. Tampoco puede estar ninguna repetida por lo mismo (parece que la única efectiva sería la última).
Para la comunicación i2c es necesario incluir la librería wire.h pero como parece que en todos los sketch para orion o arduino se incluye de inicio por lo que ponerla en la extensión sería duplicar la llamada.
Al meter en una sola sección (“work” en este caso) casi toda la programación para arduino, se hace necesario introducir saltos de linea. En la documentación encontrada parece que debería ser “\n” o “\r\n” pero parece que lo que funciona es poner “\” pegado al final del texto, salvo en las últimas lineas donde nada parece asegurar el salto.
[ "r","Read-I2C(BaseAddr: %n, RegAddr: %n )", "ReadI2C","0","0", { "setup":"Wire.begin();\n \n", "inc":" ", "def":"int datorec(int addr, int nbyte) {\ int dtr;\ Wire.beginTransmission(addr); //start talking\ Wire.write(nbyte); // Set the Register\ Wire.endTransmission();\ Wire.requestFrom(addr, 1);\ dtr = Wire.read(); //LSB\ return dtr;\ } \n", "work":"datorec({0},{1}) \n", "loop":"" } ], ],
El bloque de lectura.
"menus": { "digital":["HIGH","LOW"] }, "values":{ "HIGH":1, "LOW":0 }, "translators":{ "es_ES":{ "Extension for manage i2c bus devices": "Extensión para manejar dispositivos i2c", "Write-I2C(BaseAddr: %n, RegAddr: %n, Data: %n )": "Escribir-I2C(BaseDir: %n, RegDir: %n, Dato: %n )", "Read-I2C(BaseAddr: %n, RegAddr: %n )": "Leer-I2C(BaseDir: %n, RegDir: %n)" } } }
Tuve problemas con la traducción, si escribía yo la cabecera
"es_ES":{
Se producía algún error y no me admitía la extensión. Finalmente copiando la cabecera y editando las letras del codigo de idioma funcionó perfectamente. Supongo que igual que parece pasar con la @ en los correos de la cabecera, debe haber algún problema de codificación, supongo que con el “_”.