jager
Posts: 8
Joined: Sat Dec 13, 2014 6:44 pm

RPi <-> Arduino por medio de SPI

Sun Mar 01, 2015 2:54 pm

Aqui sigo con mi pequeño proyecto y necesito de nuevo vuestra ayuda :mrgreen:

Se me plantea el problema de comunicar un arduino nano con mi Rpi, he planteado I2C, USB o SPI y la cosa tira para el SPI ya que I2C lo uso para sensores y el USB me parece un poco "chapucero y provisional" para mantener una comunicación constante entre ambos.

Haciendo pruebas y leyendo he llegado a enviar datos de Rpi a arduino sin problema, la cosa esta en enviar de Arduino a RPi...
Codigo para arduino:

Code: Select all

#include <SPI.h>
byte buf [20];
volatile byte pos;
volatile boolean recibido;
byte pos1 = 90;
byte pos2 = 90;
byte data[] = {45, 34, 2, 12};

void setup() {
  
  Serial.begin (9600);
  pinMode(MISO, OUTPUT);//Configuramos el Miso como salida ya que el Master recibira por aqui.
  SPCR |= _BV(SPE);//Activamos el modo Slave
  pos = 0;   // Posicion 0 de los bytes recibidos
  recibido = false; //Inicializamos que no hemos recibido.

  SPI.attachInterrupt();//Activamos la interrupcion del SPI

}

// Interrupcion SPI
ISR (SPI_STC_vect)
{
  byte c = SPDR;
  buf[pos] = c;
  pos++;
  recibido = true;
}


void loop() {
  
  if (recibido)
  {
    
    for(int x = 0; x<1; x++){
      if(buf[x]==0xFF){break;}
      pos1 = buf[x];
      pos2 = buf[x+1];
      
      
    }
    Serial.println ();
    pos = 0;
    recibido = false;
  }
  Serial.print(pos1);
  Serial.println(pos2);
  
  for (int i=0; i<4; i++) {
   SPI.transfer(data[i]);
   delay(10);    // Send 8 bits
  }
  delay(1000);
  
  
  

}
Y el codigo de RPi:

Code: Select all

import spidev
import time

Value = [2,45,255]


spi = spidev.SpiDev()
spi.open(0,0)
i = 0
while(True):
    spi.xfer2(Value)
    print Value
    while(i<4):
        x = spi.readbytes(1)
        print x
        i++
    i =0
    time.sleep(1)

A ver si alguien entendido del tema me puede echar una mano, por estoy seguro que es algo simple q se me pasa por algo, pero estoy atascado y no veo la solución :x
Este codigo tal como esta me envía perfecto de Rpi a arduino pero de arduino a RPi la lectura no es continua, me explico: el print me va mostrando 0's y de tanto en tanto va mostrando los valores que envía el arduino (45, 34, 2, 12), siempre en orden pero no seguidos puede q reciba el 45, después un par de 0's el 34 otros tantos 0's el 2 y así todo el rato :?

jager
Posts: 8
Joined: Sat Dec 13, 2014 6:44 pm

Re: RPi <-> Arduino por medio de SPI

Tue Mar 03, 2015 5:25 pm

nadie tiene idea?? :/

blamarpa
Posts: 454
Joined: Thu May 23, 2013 4:02 pm
Location: España

Re: RPi <-> Arduino por medio de SPI

Thu Mar 05, 2015 12:08 pm

Parece que nadie te contesta. Yo no he trabajado con spi, con i2c me ha bastado para las cuatro cosas que he hecho.
Ya sé que spi es más rápido pero i2c es mucho mas fácil (para mi) además es sencillo configurar varios arduinos, cada uno con su dirección, en el mismo bus. Lo único a tener en cuenta es adaptar las señales de 3.3 voltios a 5 que usan los arduinos normales.
Aquí hay un ejemplo de comunicación bidireccional:
http://blog.oscarliang.net/raspberry-pi ... ected-i2c/

jager
Posts: 8
Joined: Sat Dec 13, 2014 6:44 pm

Re: RPi <-> Arduino por medio de SPI

Fri Mar 06, 2015 12:28 pm

Gracias por responder! Bueno ya estuve haciendo el I2C y la verdad q si q es mas fácil, pero después vino el problema de los sensores, el Arduino es master para los sensores pero a la vez debería ser slave para la RPi, bueno una liada, por eso pensé en SPI para una cosa y I2c para la otra.
Si alguien save como solucionar este problema también me sirve, la cosa esta en poder comunicarlo todo el como es lo de menos :mrgreen:

User avatar
Visionario
Posts: 26
Joined: Wed Jun 18, 2014 9:04 pm
Location: Puerto Ordaz, Venezuela
Contact: Website

Re: RPi <-> Arduino por medio de SPI

Sat Mar 07, 2015 9:21 pm

Hola, ¿que tal?

Se que ha pasado bastante tiempo desde tu post, quería saber si lograste resolver el inconveniente.

En todo caso, todavía tienes el puerto serial para la comunicación entre ambos equipos y usar SPI o I2C según la necesidad. Estoy trabajando en un proyecto similar y aunque todavía no he pasado de la teoría a la práctica, pienso que es viable tener una lectura continua de datos desde el puerto serial en la comunicación que viene y va RPI <--> Arduino.

Saludos
Asdrubal R. Velasquez Lagrave
Puerto Ordaz - Venezuela
https://twitter.com/Visionario

Meta
Posts: 147
Joined: Tue Nov 26, 2013 5:48 am

Re: RPi <-> Arduino por medio de SPI

Sat Mar 14, 2015 4:41 pm

Hola:

SPI es más rápido y más fácil de manejar, lo que el I2C es más lento, más antiguo y donde más se ha usado, hay más información sobre ello. Eso si, I2C estoy acostumbrado usarlo en asm para los PIC.

https://www.youtube.com/watch?v=d_laD0zb_Ew



Saludos.

Return to “Español”