UTILISER UNE CONNECTION I2C AVEC LE CUBIETRUCK

Installer les ports GPIO

Pour utiliser les pins 25 (PB19) et 23 (PB18) du port CN8 du cubietruck

  • la pin 25 étant la ligne SDA du bus I2C
  • la pin 23 étant la ligne SDK du bus I2C
  • on pourra utiliser la pin 13 du port CN8 comme masse commune
  • aller dans le répertoire /boot
  • décompresser le fichier script.bin avec la commande suivante :
    # bin2fex script.bin script.fex
  • éditer le fichier script.fex et modifier
    [twi1_para]
    twi1_used = 0
    twi1_scl = port:PB18<2><default><default><default>
    twi1_sda = port:PB19<2><default><default><default>

    par

    [twi1_para]
    twi1_used = 1
    twi1_scl = port:PB18<2><default><default><default>
    twi1_sda = port:PB19<2><default><default><default>
  • recompiler le fichier script.fex :
    fex2bin script.fex script.bin
  • rebooter le Cubietruck.

Exemple de Programmation I2C en python

il faut installer la librairie python smbus sur la Cubietruck

connection Cubietruck-Arduino (Cubietruck étant le maitre)
  • connecter la broche PB19 du Cubie à la broche A4 de l'Arduino
  • connecter la broche PB18 du Cubie à la broche A5 de l'arduino
  • connecter un broche GROUND du Cubie à la broche GND de l'arduino

Pour l'Arduino j'ai utilisé un montage avec un écran LCD 20×4 Programme à charger dans l'arduino :

#include <Wire.h>
#include <LiquidCrystal.h>
#include <string.h>
#include <ctype.h>

const int RS = 12;
const int E = 11;
const int D4 = 5;
const int D5 = 4;
const int D6 = 3;
const int D7 = 2;
LiquidCrystal lcd(RS,E,D4,D5,D6,D7);

#define SLAVE_ADDRESS 0x12
int dataReceived = 0;

void setup() {
    Serial.begin(9600);
    Wire.begin(SLAVE_ADDRESS);
    Wire.onReceive(receiveData);
    Wire.onRequest(sendData);
    lcd.begin(20,4); // 16 caracteres sur 2 colonnes
    delay(10);
    lcd.print ("LCD OK");
    delay(2000);
    delay(10);
    Serial.println("depart");
}

void loop() {
    delay(200);
}

void receiveData(int byteCount){
    //char chaine[100];
    char c[byteCount+1];
    int i = 0;
    Serial.print("Nbre donnees recues : ");
    Serial.println(byteCount);
    int z = Wire.read();
    while (Wire.available()){
       c[i] = Wire.read();
      i++;
    }
    c[i]='\0';
    Serial.println(z);
    Serial.print("->");
    for (int a = 0;a<i;a++){
      Serial.print(c[a]);
    }
    Serial.println("<-");
    lcd.setCursor(0,1);
    lcd.print(c);
}

void sendData(){
    int envoi = dataReceived + 1;
    Wire.write(envoi);
}

programme d'essais en Python sur le Cubietruck (pour pouvoir utiliser les ports GPIO il faut avoir les droits root) :

#!/usr/bin/python
#-*-coding: utf8 -*-


import smbus
import time

bus = smbus.SMBus(1)
address = 0x12


print("/////////////////")
var=[ord(z) for z in "ceci est un test"]
bus.write_i2c_block_data(address,0x00,var)