-         

Ergebnis 1 bis 10 von 10

Thema: Probleme SPI ansteuerung Pixy Cam

  1. #1
    Neuer Benutzer Öfters hier
    Registriert seit
    09.02.2015
    Beiträge
    6

    Probleme SPI ansteuerung Pixy Cam

    Anzeige

    Moin,

    ich bin neu hier und dachte ihr könnt mir bei meinem Problem helfen.

    Ich habe folgendes Problem. Und zwar arbeite ich an einem Roboter, der Objekten folgen soll.
    hier sind genaue details:
    https://learn.adafruit.com/pixy-pet-...-using-pixycam

    Nun möchte ich, dass der Atmega32u4 auf dem Arduino leonardo Rev. 3 über den SPI bus mit der Pixy Cam (CMUcam5) kommuniziert.

    Ich denke, dass ich die Register des Atmega32 richtig gesetzt habe, aber trotz allem kann ich die Kamera nicht ansprechen.
    Anbei habe ich meinen Code beigefügt und hoffe das ihr mir helfen könnt.

    Hinzu kommt das ich an der ICSP schnittstelle des Arduinos Keinen slave select habe und den nicht gezielt einstellen kann.

    Code:
    #define F_CPU 16000000UL
    
    #define UARTaktiv //Auskommentieren, um UART zu deaktivieren
    
    #include <avr/io.h>
    #include <util/delay.h>
    #include <avr/interrupt.h>
    #include "Header/Timer.h"
    #include "Header/ADC.h"
    #include "Header/USART.h"
    
    volatile uint8_t y=0;
    
    void SPIinit(void)
    {
    	DDRB = (1<<PINB1)|(1<<PINB2)|(1<<PINB0);
    	SPCR = 0b01110001;
    	SPSR= 0;
    }
    unsigned char SPI_start(unsigned char cData)
    {
    	SPDR = cData;
    	while(!(SPSR & (1<<SPIF)));
    	return SPDR;
    }
    
    int main(void)
    {
    	
    	TimerInit();
    	USARTInit();
    	ADCInit();
    	PullupSet();
    	timer_init_0();
    	//sei();
    	SPIinit();
    	
    	
    	uint8_t Sensoren =0;
    	uint8_t Zustand = 0;
    	
        while(1)
        {
    
    		_delay_ms(1);
    		SPI_start(0x00);
    		SPI_start(0xff);
    		SPI_start(0xff);
    		SPI_start(0xff);
    		
    		USARTTransmit(SPI_start(0xff));
    		USARTTransmit(SPI_start(0xff));
    		USARTTransmit(SPI_start(0xff));
    		USARTTransmit(SPI_start(0xff));
    		USARTTransmit(SPI_start(0xff));
    		USARTTransmit(SPI_start(0xff));
    		USARTTransmit(SPI_start(0xff));
    		USARTTransmit(SPI_start(0xff));
    		USARTTransmit(SPI_start(0xff));
    		USARTTransmit(SPI_start(0xff));
    		USARTTransmit(SPI_start(0xff));
    		USARTTransmit(SPI_start(0xff));
    		USARTTransmit(SPI_start(0xff));
    		USARTTransmit(SPI_start(0xff));
    		USARTTransmit(13);
    
    	}
    }
    ich hoffe ihr könnt mir helfen

    grüße im Vorraus
    Geändert von cnc13 (09.02.2015 um 12:29 Uhr)

  2. #2
    Neuer Benutzer Öfters hier
    Registriert seit
    09.02.2015
    Beiträge
    6
    keiner der mir helfen kann? :/

  3. #3
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    08.09.2007
    Ort
    Berlin
    Alter
    24
    Beiträge
    1.544
    Hi,

    wenn ich dich richtig verstehe, hast du kein CS Signal? Dann wirds nicht funktionieren, SPI braucht dieses Signal. Entweder du nutzt ein anderes Protokoll, oder du stellst irgendwie einen Pin zur Verfügung.

    Gruß
    Chris

  4. #4
    Neuer Benutzer Öfters hier
    Registriert seit
    09.02.2015
    Beiträge
    6
    Also laut der cmucam.org Wiki brauche ich keinen Slave Select bei dem kameramodul und dem Arduino
    http://cmucam.org/projects/cmucam5/wiki/Porting_Guide

    ICSP SPI - this is the default port that uses 3 wires (pins 1, 3, and 4 of the I/O connector) and is used to communicate with Arduino through the ICSP connector. This version of SPI does not use a slave select signal.
    deshalb verstehe ich das ja nicht ...

  5. #5
    Neuer Benutzer Öfters hier
    Registriert seit
    09.02.2015
    Beiträge
    6
    So ich habe mich nochmal an das Problem mit der SPI-Übertragung rangesetzt. Zu folgender Erkenntnis bin ich gekommen:
    - Ich kann über die Schnittstelle des Arduinos mit der Pixy-Cam kommunizieren, dies aber nur in eine Richtung (Von Pixy-Cam zu Arduino).
    - Ich erhalte einen 16 bit Wert mit dem niederwertigsten Byte als erstes.
    - Die Sync-Bytes sind das einzig sinnvolle was ich bekomme (Checksum stimmt vom Rest nicht).

    hier der link zu der Seite wo das alles beschrieben ist:

    http://www.cmucam.org/projects/cmuca.../Porting_Guide

    Und im Anschluss nochmal der überarbeitete Code.

    Meine Probleme sind:

    - Daten über SPI von Arduino zu Pixy schicken.
    - Vernünftige Daten erhalten nach den Sync-Bytes (Checksum)


    Ich hoffe ihr könnt mir helfen.
    Danke im Voraus

    Code:
    #define F_CPU 16000000UL
    
    #define UARTaktiv //Auskommentieren, um UART zu deaktivieren
    
    #include <avr/io.h>
    #include <util/delay.h>
    #include <avr/interrupt.h>
    
    void TimerInit ()
    {
    	TCCR1A=0b10100001;
    	TCCR1B=0b00000011;
    	DDRB=(1<<PINB6) | (1<<PINB5);
    }
    
    	
    	void USART_init(uint8_t baud)
    	{
    		
    		/*Setzen der Baudrate (Übertragungsrate)*/
    		UBRR1H = (unsigned char) (baud>>8);
    		UBRR1L = (unsigned char) baud;
    		
    		/*Aktivieren von Empfänger(RX) und Sender(TX)*/
    		UCSR1B = (1<<RXEN1) | (1<<TXEN1);
    		
    		/*Setzen des Formates: 8bit Groß, 2bits zum Stoppen*/
    		UCSR1C = (1<<USBS1) | (3<<UCSZ10);
    		
    	}
    	
    	void USARTTransmit (unsigned char data)
    	{
    		/*Auf leeren Übertragungspuffer warten*/
    		while (!(UCSR1A & (1<<UDRE1)) );
    		
    		/*Packe die Daten in den Puffer und sende diese*/
    		UDR1 = data;
    	}
    	
    	void USART_Recieve()
    	{
    		/*Warte auf Empfangen von Daten*/
    		while (!(UCSR1A &(1<<RXC1)) );
    		
    		/*Bekomme die Daten vom Puffe und gebe sie zurück*/
    		return UDR1;
    	}
    	
    void SPIinit(void)
    {
    	DDRB = (1<<PINB1)|(1<<PINB2)|(1<<PINB0);
    	SPCR = 0b01110001;
    	SPSR= 0;
    }
    unsigned char SPI_start(unsigned char cData)
    {
    	SPDR = cData;
    	while(!(SPSR & (1<<SPIF)));
    	return SPDR;
    }
    
    uint8_t SensorArray()
    {
    [...]
    }
    
    void PullupSet()
    {
    	PORTB = (1<<PINB7);
    	PORTC = (1<<PINC6);
    	PORTD = (1<<PIND4);
    	PORTF = (1<<PINF7) | (1<<PINF5) | (1<<PINF4);
    }
    
    
    int main(void)
    {
    	uint16_t ObjectBlock;
    	uint16_t Checksum;
    	uint16_t signatureNr;
    	uint16_t xposition;
    	uint16_t yposition;
    	uint16_t width;
    	uint16_t height;
    	uint16_t count;
    	uint8_t buffer;
    	
    	uint8_t sig1;
    	uint8_t sig2;
    
    	TimerInit();
     	USART_init(103);
    	PullupSet();
     	SPIinit();
    
        while(1)
        {
    		count++;
    		buffer=SPI_start(0xFF);
    		
    		if(buffer==0xAA )
    		{
    			count=0;
    			sig1 =(buffer);
    		}
    		else if (count==1)
    			sig2 =(buffer);	
    		else if (count==2)
    			Checksum=buffer;
    		else if (count==3)
    			Checksum=Checksum+buffer<<8;
    		else if (count==4)
    			signatureNr = buffer;
    		else if (count==5)
    			signatureNr+= buffer<<8;
    		else if (count==6)
    			xposition=buffer;
    		else if (count==7)
    			xposition+=buffer<<8;	
    		else if (count==8)
    			yposition=buffer;
    		else if (count==9)
    			yposition=yposition+buffer<<8;
    		else if (count==10)
    			width=buffer;
    		else if (count==11)
    			width=width+buffer<<8;	
    		else if (count==12)
    			height=buffer;
    		else if (count==13)
    			height=height+buffer<<8;		
    
    		if ((sig1==0xAA) && (sig2==0x55))
    		{
    		USARTTransmit((uint8_t)((xposition & 0xff00)>>8));
    		USARTTransmit((uint8_t)(xposition & 0x00ff));
    		USARTTransmit(sig1);
    		USARTTransmit(sig2);
    		USARTTransmit((uint8_t)((Checksum & 0xff00)>>8));
    		USARTTransmit((uint8_t)(Checksum & 0x00ff));
    		USARTTransmit((uint8_t)((signatureNr & 0xff00)>>8));
    		USARTTransmit((uint8_t)(signatureNr & 0x00ff));
    		USARTTransmit((uint8_t)((xposition & 0xff00)>>8));
    		USARTTransmit((uint8_t)(xposition & 0x00ff));
    		USARTTransmit((uint8_t)((yposition & 0xff00)>>8));
    		USARTTransmit((uint8_t)(yposition & 0x00ff));
    		USARTTransmit((uint8_t)((width & 0xff00)>>8));
    		USARTTransmit((uint8_t)(width & 0x00ff));
    		USARTTransmit((uint8_t)((height & 0xff00)>>8));
    		USARTTransmit((uint8_t)(height & 0x00ff));
    		USARTTransmit(13);
    		}
     	}
    }

  6. #6
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    09.10.2014
    Beiträge
    2.441
    der Standard-SPI-Modus verwendet keinen CS/SS pin,
    es gibt aber eine Pixy_SS lib, wo du Kabellitze 7 als CS/SS Pin verwenden kannst, d.h. aber: es geht nicht mehr mit dem Standard-SPI-Kabel.
    - kA ob das was du vorhast mit CS besser geht und ob dir das jetzt weiterhilft... :-/
    ·±≠≡≈³αγελΔΣΩ∞ Schachroboter:www.youtube.com/watch?v=Cv-yzuebC7E Rasenmäher-Robot:www.youtube.com/watch?v=z7mqnaU_9A8

  7. #7
    Neuer Benutzer Öfters hier
    Registriert seit
    09.02.2015
    Beiträge
    6
    Hi, danke für die Antwort!

    Ich weiß aber, dass es auch ohne CS Pin funktioniert, da es so in der Dokumentation steht und ich das mitgelieferte SPI Kabel verwende.
    Außerdem Empfange ich ja Daten, darunter auch die Korrekten Sync Bytes, daher denke ich, dass es so schon seine Richtigkeit hat.

    Das Problem ist nur, dass die Daten, die ich erhalte falsch sind, abgesehen von den Sync Bytes.

    mfg
    cnc 13

  8. #8
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    09.10.2014
    Beiträge
    2.441
    was hiervon hast du NICHT verstanden...?

    Zitat Zitat von HaWe Beitrag anzeigen
    der Standard-SPI-Modus verwendet keinen CS/SS pin,
    es gibt aber eine Pixy_SS lib, wo du Kabellitze 7 als CS/SS Pin verwenden kannst
    und es stimmt: Die Pixy Cam sendet häufig falsche Daten und abgebrochene Daten und hängt sich auf!
    das kannst du seitenweise im Pixy Forum nachlesen.
    Ich halte das Ding schlicht für unausgereift, darüberhinaus ist sie hundsmiserabel dokumentiert, es fehlen z.B. komplett die für die verschiedensten Funktionen notwendigen detaillierten Beispielprogramme insb. für Arduino.

    Code:
    Detected 3:
      block 0: sig: 1 x: 127 y: 100 width: 17 height: 32 angle 0
      block 1: sig: 1 x: 261 y: 125 width: 86 height: 19 angle 0
      block 2: sig: 2 x: 74 y: 165 width: 75 height: 20 angle 0
    reorder
    reorder
    reorder
    reorder
    reorder
    reorder
    Detected 1:
      block 0: sig: 2 x: 283 y: 180 width: 14 height: 3 angle 0
    reorder
    Detected 2:
      block 0: sig: 2 x: 108 y: 187 width: 7 height: 10 angle 0
      block 1: sig: 3 x: 75 y: 174 width: 7 height: 9 angle 0
    cs error
    Detected 2:
      block 0: sig: 2 x: 109 y: 188 width: 8 height: 12 angle 0
      block 1: sig: 3 x: 97 y: 178 width: 8 height: 6 angle 0
    cs error
    reorder
    Detected 3:
      block 0: sig: 2 x: 109 y: 188 width: 8 height: 10 angle 0
      block 1: sig: 3 x: 75 y: 174 width: 8 height: 10 angle 0
      block 2: sig: 3 x: 96 y: 176 width: 9 height: 8 angle 0
    cs error
    Detected 2:
      block 0: sig: 2 x: 108 y: 189 width: 7 height: 6 angle 0
      block 1: sig: 3 x: 97 y: 176 width: 8 height: 8 angle 0
    cs error
    Detected 3:
      block 0: sig: 2 x: 109 y: 187 width: 8 height: 9 angle 0
      block 1: sig: 3 x: 75 y: 174 width: 8 height: 9 angle 0
      block 2: sig: 3 x: 97 y: 175 width: 8 height: 3 angle 0
    cs error
    Detected 2:
      block 0: sig: 2 x: 109 y: 187 width: 8 height: 10 angle 0
      block 1: sig: 3 x: 97 y: 176 width: 8 height: 9 angle 0
    cs error
    ich habe daher jetzt die Retoure innerhalb der Garantiezeit eingeleitet.
    Geändert von HaWe (26.03.2015 um 09:49 Uhr)
    ·±≠≡≈³αγελΔΣΩ∞ Schachroboter:www.youtube.com/watch?v=Cv-yzuebC7E Rasenmäher-Robot:www.youtube.com/watch?v=z7mqnaU_9A8

  9. #9
    Neuer Benutzer Öfters hier
    Registriert seit
    09.02.2015
    Beiträge
    6
    hmm kay, also meinst du ich sollte es mit der Kabellitze 7 als CS/SS-Pin versuchen und gucken ob ich dadurch was vernunftiges raus bekomme?

    Wie hast du das mit dem Retoure innerhalb der Garantiezeit hinbekommen?

  10. #10
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    09.10.2014
    Beiträge
    2.441
    wenn du erfahrener, möglichst berufsmäßiger embedded-C-Programmierer bist: probier's.
    Mach aber nichts kaputt, insb. kein Kabel etc.!
    Falls nicht - mein Tipp: lass dir vom Händler erklären wie es funktioniert.

    ps, edit: Laut Pixy-Hersteller machen die deutschen Vertriebspartner auch den Support, dazu gibt es eine entsprechende Vereinbarung!

    Falls es dir der Händler nicht erklären kann und es weiterhin nicht funktioniert: Händler Bescheid geben dass Funktion der Cam fehlerhaft ist und ordnungsgemäße Inbetriebnahme laut zugesagter Eigenschaften nicht möglich, er möchte dir bitte die Retouren-Modalitäten mitteilen.
    Viel Glück!
    ·±≠≡≈³αγελΔΣΩ∞ Schachroboter:www.youtube.com/watch?v=Cv-yzuebC7E Rasenmäher-Robot:www.youtube.com/watch?v=z7mqnaU_9A8

Ähnliche Themen

  1. Arduino Due mit Pixy-Cam und eigenem TFT-Monitor
    Von HaWe im Forum Eigene fertige Schaltungen und Bauanleitungen
    Antworten: 0
    Letzter Beitrag: 28.01.2015, 20:42
  2. Antworten: 0
    Letzter Beitrag: 23.11.2014, 15:43
  3. PGA2320 SPI Ansteuerung
    Von gesamtplan im Forum Elektronik
    Antworten: 3
    Letzter Beitrag: 05.08.2007, 13:40
  4. SPI - SD -MC Karten Ansteuerung
    Von Smi im Forum PIC Controller
    Antworten: 5
    Letzter Beitrag: 03.04.2006, 16:57
  5. SPI ansteuerung
    Von BennoK im Forum Controller- und Roboterboards von Conrad.de
    Antworten: 0
    Letzter Beitrag: 09.01.2006, 14:18

Stichworte

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •