Frambuesa Pi - Arduino - Vincular dos vía el bus I2C


atención : Este artículo ha sido traducido automáticamente por Bing Traducir


Advertencia : Este artículo ha sido traducido automáticamente por Bing Translate

Algunos dicen que ¡ no perros salchichas pero a veces por qué no vinculantes. Raspberry Pi y el Arduino no son necesariamente también se opuso a, con incluso puntos en común pero cada beneficios que pueden ser buenos combinar.

RaspArduinoI2CCon Frambuesa Pi puede mediante puertos de componentes externos de control GPIO y el hack en electrónica. Pero me imagino que algunos ya han dominado su Arduino, ellos tienen el equipo, etc.. Et puis ça fait un tuto en plus 😀

Para enlazar los dos, Pasaremos por el protocolo I2C. Varias razones para ello : No utilice el puerto USB, Raspberry Pi es limitada (Si quieres hacerlo de todos modos hay un artículo en el MagPi #15 y me haré una tarde). Y no use el puerto serie. Aquí está un poco más personal, Porque tengo una tarjeta Trozo de Pi en una frambuesa para la estación meteorológica y usa el puerto serial para sensores inalámbricos.

El protocolo I2C, creada por Philips con una orientación de página, permite varios componentes interactuar entre ellos de manera bidireccional pero semidúplex sólo. Como de costumbre, más información en Wikipedia.

Hay un principio de amo y esclavo. Aquí utilizaremos Raspberry Pi como maestro y el Arduino como esclavo.

Principalmente conectar dos dispositivos necesita saber lo que los pernos a utilizar !
La frambuesa es sobre los GPIO 2 y 3 (para los mapas de revisión modelo B 2, ésos con los agujeros de montaje en el mapa)

raspberry-i2c

Para el Arduino, Sucede en los pernos para las tarjetas de tipo Arduino Uno A4 y A5. Para otras tarjetas, Puede encontrar más información en el sitio oficial de Arduino.

arduino-i2c-2Es necesario añadir una conexión a la masa entre los dos. Así que tienes tres cables.

Antes de conectar los dos dispositivos, Es necesario asegurarse que serán capaces de comunicarse. Toda la información está en el sitio de adafruit Pero por mayor, Aquí es qué hacer.

Definir el Arduino como esclavo

Es relativamente sencillo incluyendo el módulo en el programa. Tomé la dirección 0 x 12, pero usted puede elegir 0 x 0 x 77 03 (en hex) :

#incluyen <WIRE.h>
#definir dataReceived 0 x 12 int SLAVE_ADDRESS = 0;
instalación de vacío() {
    Serial.Begin(9600);
    WIRE.Begin(SLAVE_ADDRESS);
    Wire.onReceive(receiveData);
    Wire.onRequest(sendData);
}
bucle vacío() {
    retardo(100);
}
void receiveData(int byteCount){
    Tiempo(WIRE.available()) {
        dataReceived = Wire.read();
        Serial.Print("Datos recibidos : ");
        Serial.println(dataReceived);
    }
}
void sendData(){
    int enviar = dataReceived + 1;
    WIRE.Write(envío);
}

Entenderás, el programa Inicializa el Arduino con dirección 0 x 12, define el método de recepción de datos, el método de envío de datos y vamos a enviar a la tarjeta con la interfaz.

Habilitar la administración I2C de Frambuesa Pi

De forma predeterminada, las distribuciones del tipo Raspbian desactivar la gestión de I2C para salvar la memoria utilizada por el módulo. Para volver a habilitar, Es fácil y está en el archivo /etc/modprobe.d/raspi-Blacklist.conf. Necesitamos ser comentada con un # la línea :

lista negra i2c-bcm2708

Descansar para habilitar el módulo cada vez que empiezas a. Está en el archivo /etc/modules, añadiendo al final una nueva línea :

I2C - dev

Luego instalar la suite de herramientas de administración de I2C

apt - get install i2c-herramientas

Usted tendrá que reiniciar la frambuesa para aparecer dos archivos :

1._ssh-2
Gracias a ellos serás capaz de comunicarse en el bus I2C !

Puede enumerar dispositivos con el comando :

i2cdetect y 1

Para los modelos de 256 MB (como uno que usé para mis pruebas) :

i2cdetect y 0

Se trata de. Siguiente paso : Conecte el Arduino y hablar con él !

Comunicarse con Arduino

Ahora puedes conectar el Arduino a la frambuesa y convertir todo este mundo pequeño !

Atención, en el esquema, Conexión SDA y SCL se invierte ! Le rouge en A5 et le balnc va en A4 😉

ArduinoRaspberry

Una vez hecho, iniciar sesión en el Pi de frambuesa y reiniciar el i2cdetect de comandos con el parámetro adecuado :

1._ssh-2

El ajuste en el sketch de Arduino, 0x 12, aparece en los dispositivos detectados. Progresa !

Ahora tenemos que aplicar la secuencia de comandos de Frambuesa Pi que envíe/reciba con Arduino. Para esto, el más sencillo es instalar el soporte de I2C en scripts en Python. Esto es lo que hará que python-smbus

apt - get install python-smbus

Ahora estamos equipados para hablar con nuestro Arduino. Para esto un pequeño programa todo simple. Enviar una cifra entre 0 y 8 y nos devuelven este número más uno :

SMBus importación import tiempo
# Reemplazar 0 por 1 tan nuevo autobús frambuesa = smbus.SMBus(0)
Dirección = 0 x 12 impresión "El valor enviado 3"
bus.write_byte(Dirección, 3)
# Descanso 1 en segundo lugar para permitir el tratamiento ser time.sleep(1)
respuesta = bus.read_byte(Dirección)
imprimir "La respuesta de la arduino : ", respuesta

El resultado de la ejecución :

1._ssh-2

Deja que hable tu imaginación para llevar ahora el Arduino por un poco más complejas dependiendo de lo que conectó enviar aplicaciones !

Fuente e inspiración : una sección d’Oscar

Posiblemente le gustan también....

  • ubik75

    Hola,

    Tras leer el artículo, Me pregunto si debe añadirse entre la frambuesa y el arduino una lógica para proteger 3, 3V-5V arduino Pi ?

    • Yo hice la pregunta si no paso el Arduino en 3.3 Pero parece que no es necesario. Puede ser que expertos confirme (o no)

      La frambuesa ft está funcionando 3.3 Voltios mientras está funcionando el Arduino 5 Voltios. Hay tutoriales de sugieren el uso de un convertidor de nivel para la comunicación I2C. Esto no es necesario si el ft frambuesa es funcionar como 'maestro' y el Arduino está corriendo como "Eslavos".

      La razón funciona es porque el Arduino no tiene ninguna dominadas resistencias instalados, Pero el encabezado P1 de la frambuesa Pi tiene resistencias de 8 ohmios de 1 k a la 3.3 voltios de potencia carril. Los datos se transmiten tirando de las líneas a 0v, para una señal de "alto" lógica. Para la señal lógica "baja", se tiró al nivel de voltaje suministro ferroviario. Porque no hay ninguna resistencias pull-up en el Arduino y 3.3 voltios está dentro del rango de nivel de lógica "baja" para el Arduino todo funciona como debería.

  • En realidad : Si l'Arduino est at maître, Il enverra du 5V et là le va RPI avoir très mal.
    Dans le bosquejo de l'Arduino, le manque de Il +1 pour le tuto. Toujours sur l'Arduino, Il est créé déconseillé de faire un interrupción Serial.print dans une : le CE est cas (interrupción être dans une) receiveData dans et dans sendData => Completamente puede enfoirer el programa y “planta” el Arduino. Los conectores I2C también están disponibles en el otro lado el Arduino, justo después de GND y AREF (Está escrito por debajo de la Arduino Uno).
    ¿Por qué no también administrar lado interrupción RPI ? (más bien el sueño de un segundo que es feo) Esto es python que no ?

    • Tutorial corregido, Gracias.
      Gracias por todos estos consejos. No conozco bastante el Arduino para controlar todo. El objetivo del tutorial es conectar los dos y utilizarlo como base para otras. Muchas gracias por la Info, je vais regarder comment remplacer le sleep tout moche 🙂
      La prochaine étape sera d’avoir une liaison sans fil donc au revoir I2C 😉

  • Julien

    Atención, en el esquema, Conexión SDA y SCL se invierte !

  • Paul

    Hola,
    Estoy en clase Terminal sti2D y tenemos un proyecto para la bandeja que es para la fabricación de una cámara de CCTV puede ser controlado remotamente (Sistema android por ejemplo) y eso puede hacer un PAN/TILT.
    Pensamos que así conectar Arduino y frambuesa vía I2C siguiendo el método.
    El problema es que no sabemos cómo pedir el 2 Actuadores para mover la cámara….
    Une aide de votre part ne serait pas de refus 😉
    Gracias

    • Hola,
      Necesito un puente H Si no me equivoco : L293D
      Hay un tutorial aquí : http://myrobotlab.net/tutorial-control-a-dc-motor-with-raspberry-pi/

      • Kelias

        El L293D es útil para un motor DC que funcionará continuamente, que normalmente no es el caso de un actuador.

        Personalmente he estado siguiendo este artículo y funcionó muy bien
        http://forum.pcinpact.com/topic/165594-raspberry-pi-fabriquons-des-trucs/page-3#entry2750001

  • Raspbian

    Hola ,
    Premierement super tuto merci 🙂

    Tengo una pequeña pregunta,
    Recibir varios valores en mi arduino es posible enviar la 2 valores al mismo tiempo en el bus i2c ?
    Gracias

  • Thibault

    Hola, Según algún sitio debe utilizar un conversor entre el arduino y la frambuesa porque l’ uno trabajaría en 5v y 3v.
    Este es el caso ?

  • Thibault

    Perdón no había leído los comentarios anteriores. Aparentemente no es necesario.

    Sin embargo cuando hago un i2cdetect no tengo un dígito el “mesa” Pero tengo todo lo que está lleno. Y devuelve el pe arduino 0 y el arduino muestra como datos recibidos -1

    • Vendrá un problema de cableado o un error en el módulo si están cargados los módulos del Protocolo 1-wire (W1-gpio, W1-xxxx)

  • Jody

    Hola,

    Gracias muchas gracias funciona !

    Para obtener información si tienes como yo :

    root@raspberrypi:/home/pi# python testI2c.py
    Envoi de la valeur 3
    Traceback (most recent call last):
      File "testI2c.py", line 9, in 
        bus.write_byte(address, 3)
    IOError: [Errno 5] Input/output error
    

    Considerar el cambiar :

    bus = smbus.SMBus(0)

    at

    bus = smbus.SMBus(1)
    • Sí el 0 es para la revisión de A y B del modelo 1. El 1 es para la revisión del modelo B 2

  • I ' laam

    Hola,
    Merci pour le tuto 🙂
    Me gustaría conectar un RPI con otra placa electrónica (No se comercializan) en I2C con el IPC en modo slave. Yo también que el IPC se comunica con el maestro cada vez con una dirección diferente que la dirección que le pidió al dueño. Es posible asignar varias direcciones a la RPI?
    Gracias

    • En el principio de la I2C dispositivo no puede tener 2 direcciones. Dans la programmation i2c je suis pas expert 😉

      • I ' laam

        D’accord merci pour votre réponse 🙂

  • I ' laam

    Hola,
    Me dirijo a usted otra vez.
    Se trata de, Leí en un tutorial que el IPC puede comunicarse sólo en modo maestro porque el kernel de linux no permite comunicación en modo slave (Todavía no está implementada). ¿Podría confirmar si esto es cierto ? Gracias.

    • Si esto es lo que parece ser el caso. El núcleo en él incluso no soporta el modo esclavo. Y ni siquiera un conductor no debe ser capaz de resolver el problema porque el chipset utilizado en la frambuesa (BCM 2835)

      • I ' laam

        ¡ Es una vergüenza ! Creo que en este caso utilizaré en lugar de un Arduino. Merci bien 🙂

  • Hola amigos como estan,necesito un programa para comunicar un Arduino con raspberry pi el cual a traves de el Puerto serial manadar 2 senales distintas una que mida temp y otra que mida Ph, como se hace???? podrian por favor ayudarme me urge. es para un projecto de la U estoy confundido de como hacerlo.

    • Hola,
      Tienes un ejemplo en el post. Lo puede utilizar para definir su propio protocolo para comunicar una estructura de datos. Hasta que sepa cómo obtener los valores de los sensores de la Arduino.

  • Pingback: Es para pronto | cueva Zragg()

Handpicked links

disk Page Caching using disk: enhanced Database Caching 128/589 queries in 3.536 seconds using disk Served from: pihomeserver.fr @ 2017-06-15 21:51:30 by W3 Total Cache -->