- MultiPlus Wechselrichter Insel und Nulleinspeisung Conrad         
Seite 2 von 3 ErsteErste 123 LetzteLetzte
Ergebnis 11 bis 20 von 22

Thema: ProBot mit asuro-Mega8

  1. #11
    Moderator Robotik Visionär Avatar von radbruch
    Registriert seit
    27.12.2006
    Ort
    Stuttgart
    Alter
    61
    Beiträge
    5.799
    Blog-Einträge
    8
    Anzeige

    Praxistest und DIY Projekte
    Hallo

    Ich werde den Strangstrom der IR-LEDs messen, wenn ich den ProBot soweit zusammengelötet habe. Mehr als ca. 20mA sollten es nicht werden, weil die LEDs direkt vom Kontrollerpin getrieben werden. Stromsparen ist hier nicht so entscheidend, weil die LEDs eh mit 36kHz getaktet werden und nur bei der IR-Kommunikation, beim ACS und beim Flashen aktiv sind.

    Die Motoransteuerung werde ich wie oben beschrieben mit vier Leitungen versuchen. Die gemeinsame Enableleitung werde ich am IC1 splitten und die zweite fehlende Verbindung zum X1-Prozessorsockel (Pin5?) über die Con1/Con3-Leitung versuchen.

    Da ich jetzt den extrem überteuerten Quarzoszillator mitbestellt habe werde ich es damit zuerst versuchen. Ich glaube, der "Schwinger" im orginalen asuro ist eigentlich ein Quarz-Resonator, selbst beim C ein Cent-Artikel.

    Der asuro prüft die Batteriespannung automatisch und streikt, wenn sie zu niedrig ist (VL-Meldung). Deshalb brauche ich (vorerst?) diese Messung. Außerdem ist PC5 auch Clock für den I2C-Bus. Hier werde ich mir was überlegen müssen, weil ich doch das ProBot-EEProm per I2C ansprechen möchte.

    Die Resettaste des ProBot geht offensichtlich nicht direkt zum Mega128-Resetpin (Anleitung S.42), weshalb ich wohl einen zweiten Eingang opfern werde. Ohne die asuro-Tasten währe zusätzlich zu PD4/5 (Motor) auch PD3 frei. Leider ist der zweite freie Tastenpin PC4 neben ADC4 auch SDA. Soundeingang oder I2C ist nun die Frage.

    Das Mikrofon nur digital auszuwerten, wird glaube ich schwer.
    Als Schallsensor würde es ausreichen, wenn das verstärkte Mikrofonsignal einen Pegelwechsel an einem digitalen Eingang erzeugen würde.

    Gruß

    mic
    Bild hier  
    Atmel’s products are not intended, authorized, or warranted for use
    as components in applications intended to support or sustain life!

  2. #12
    Erfahrener Benutzer Robotik Visionär
    Registriert seit
    26.11.2005
    Ort
    bei Uelzen (Niedersachsen)
    Beiträge
    7.942
    Die origninal Lib. wird man vermutlich sowieso nicht nehmen können, schon wegen dem Motor. Dann sollte es auch kein Problem sein die Messung der Versorgungsspannung rauszunehmen, oder duch die indirekte Methode zu ersetzen.

    Für die Tasten müßten sonst den I2C Bus nutzen, statt der Notlösung via ADC.

    Wenn man den Mega8 (bzw, Mega16 im SMD Gehäuse hat, hätte man 2 extra ADC Eingänge).

  3. #13
    Moderator Robotik Visionär Avatar von radbruch
    Registriert seit
    27.12.2006
    Ort
    Stuttgart
    Alter
    61
    Beiträge
    5.799
    Blog-Einträge
    8
    Hallo

    Die Batterieüberwachung erledigt beim asuro der Bootlader, oder? Mein Umbau soll ja die asuro-Library nur als Basis verwenden. Angedacht habe ich eine angepasste ProBot-Version die ich aus einer älteren Version mit wastes IR-Mod schnitzen möchte.

    Als Kontroller möchte ich in erster Linie einen programmierten asuro-Mega8 verwenden. Ziel ist ein weitgehend asurokompatibler ProBot. Der wäre sicher nicht nur für asuro-Besitzer als "Upgrade" interessant, auch als Einsteigerbot wäre das bestimmt eine Alternative zum orginalen asuro. Die störungsanfällige H-Brücke des asuro entfällt, die zickige Tastenabfrage (vorerst) ebenfalls. Hinzu kommt das ACS und Sound. Durch die größere Platinenfläche dürfte der ProBot nicht so fummelig zu löten sein wie der asuro. Die neue Ladefunktion scheint mir auch vorteilhaft. Fehlt eigentlich nur noch die pfiffige Adapterlösung für einen Verkaufsschlager ;)

    Interessanterweise wird beim ProBot die FrontLED zwischen Vcc und Kontrollerpin angeschlossen.

    Mit den LEDs D14/15 könnte man die BackLEDs nachbilden. Allerdings müßte man dazu etwas auf der ProBot-Platine rumkratzen: Vcc anodenseitig unterbrechen und an Mega8-PD7(ODO-LEDs), die LEDs verpolt einlöten und die Widerstände (R26/27) an Mega8-PC0/1 (ODO-Eingänge).

    Gruß

    mic
    Bild hier  
    Atmel’s products are not intended, authorized, or warranted for use
    as components in applications intended to support or sustain life!

  4. #14
    Erfahrener Benutzer Robotik Visionär
    Registriert seit
    26.11.2005
    Ort
    bei Uelzen (Niedersachsen)
    Beiträge
    7.942
    Soweit ich gelesen habe, geht es ja auch den orginal Prozessor direkt mit GCC / Bascom zu beschreiben. Man ist also nicht auf den eher langsamen Zwischencode Interpreter angewiesen. Den einzigen Vorteil den man damit durch den Mega8 hat, wäre ein günstigerer Preis, vor allem wenn man gegegentlich mal einen µC zerschießt, weil die Spannung nicht mal geregelt ist. Wenn man den Preis vergeleicht, ist zumidenstens das Einstigsset mit dem CControl Modul nicht so viel teurer als der Bausatz ohne das Modul.
    Das CControll Modul hat ja auch ein paar Vorteile gegen einen Mega8: Man hat deutlich mehr Speicher und wohl auch mehr IO Ports.


    Änderungen bei den Motortreiben wären ja unabhängig von einem Austausch der µCs. Auch ein mehr oder weniger Asuro compatible Software wäre mit den Ccontrol Modul als µC wohl möglich. Der Unterschied zwischen einem Mega128 und Mega8 ist bei der Programmierung nicht groß. Da sind die unterschiede in den Sensoren schon wesentlicher.

  5. #15
    Moderator Robotik Visionär Avatar von radbruch
    Registriert seit
    27.12.2006
    Ort
    Stuttgart
    Alter
    61
    Beiträge
    5.799
    Blog-Einträge
    8
    Hallo

    Hier mal ein Zwischenstand (damit ihr nicht denkt ich tu nix):

    Bild hier   Bild hier  
    Bild hier  
    http://www.youtube.com/watch?v=fEu8T7Z2TwQ

    Die ProBot-Main-Platine mit minimaler Bestückung, der Adapter mit dem asuro-Mega8, 8MHz Quarz-Resonator (den ich inzwischen besorgt habe) bringt es immerhin zur VL-Meldung im Terminal :) Das bedeutet: Mega8 läuft mit richtigem Takt und kann Senden (der TSOP ist noch nicht eingelötet), irgendwas stimmt mit der Batteriespannung nicht (2,4V gemessen an Pin28). das sieht doch vielversprechend aus :)

    Der ProBot-Bausatz kommt im hübschen bunten Karton mit übersichtlichem Kunstoffsorter (Lieferzeitbei mir: 2 Tage) und ist leider nicht so optimal wie ich es erwartet hätte. Löten klappt prima, Doku dazu ist gut , aber leider war der Bausatz nicht komplett :(

    Statt der fünf 1,5k Ohm-Widerstände (Vorwiderstände für die Low-Current_Leds) war nur einer im Bausatz, dafür hatte ich zusätzlich 4 7,5k-Widerstände im Paket. Als Ersatz verwende ich nun 1K für R24-R27.

    Dass der Vorwiderstand für den TSOP zu groß ist hat sich wohl inzwischen rumgesprochen. Im ProBot-Schaltplan ist deshalb R11 150 Ohm anstatt 470 beim asuro. Blöderweise ist im Bausatz ein 470er, den habe ich nun durch 120 Ohm ersetzt. Im Datenblatt des TSOP werden 100 Ohm und 4,7µF vorgeschlagen. Warum sowohl ProBot (150/10) wie auch asuro(470/220-100nF) von dieser Empfehlung abweichen ist mir unklar)

    Da ich sicher nur Akkus verwenden werde habe ich die Diode(D4) nicht bestückt, wohl aber den Jumper(JP1) um später einfache Strommessungen durchführen zu können. Dabei habe ich einen kleinen Fehler im Schaltplan entdeckt: Der Widerstand R8 für die LED D5 (grüner DauerLED) geht nicht nach dem Jumper ab sondern direkt nach dem Schalter(SW1) Es ist mir unverständlich warum in solch einem einfachen Bausatz heutzutage noch solche Fehler auftauchen. Aber die Ansteuerung der Motortreiber ließ ja schon erahnen, dass auch der Probot nicht perfekt ist.

    Gruß

    mic
    Bild hier  
    Atmel’s products are not intended, authorized, or warranted for use
    as components in applications intended to support or sustain life!

  6. #16
    Erfahrener Benutzer Robotik Visionär
    Registriert seit
    26.11.2005
    Ort
    bei Uelzen (Niedersachsen)
    Beiträge
    7.942
    Die 7,5 K Widerststände wären für Low Current LEDs auch nicht so verkehrt. Mit kamen die 1,5 K schon recht klein vor als ich den Plan überflogen hatte.
    Wenn die faschen Widerstände das einzige Problem ist, dann geht es ja noch.

    So ganz Ideal ist die Schaltung nicht. Was mit wirklich verwirrt hat ist der Mikrofonverstärker. Da wäre ein OP wie der LM358 deutlich besser als ein kleiner Leistungs Audioverstärker. Das hätte auch noch mal gut 3 mA an Strom gespart. So viel günstiger als ein LM358 kann der LM386 auch nicht sein. Bei Rechelt ist der sogar etwa doppelt so teurer.

    Wenn man schon Motortreiber wie die L293 nimmt, könnte man die auch besser direkt von der Batterie speisen, und nicht erst über die Diode. Sinnvoll wäre dann auch die Option einen Low Drop spannungsregler für den µC und die Sensoren zu spendieren. Für den Bausatz kann man es ja ruhig bei der Diode lassen, aber der Regler als Option wäre echt gut: Man ist sich sicher den µC nicht duch zu hohe Spannung zu beschädigen und selbst 7,2 V Akkus sollten gehen, für mehr power.

    Die ansteuerung der Motoren ist ja ohnehin ein kleiner Witz. Wozu so mit Pins geizen, wo der Mega128 bzw. Das CControll Modul doch genug hat.

  7. #17
    Moderator Robotik Visionär Avatar von radbruch
    Registriert seit
    27.12.2006
    Ort
    Stuttgart
    Alter
    61
    Beiträge
    5.799
    Blog-Einträge
    8
    Hallo

    Es geht voran:
    Bild hier   Bild hier   Bild hier  

    Alles bestückt und getestet was man benötigt um mit dem Probot einen asuro zu simulieren. Hier eine kleine Liste der Probleme und Erkenntnisse:

    Motortreiber:
    Wie geplant sind die PWM-Signale mit den Enable-Eingängen verbunden. Dazu habe ich auf der Motorplatine die Leiterbahn zwischen IC1:1 und IC1:9 unterbrochen. Dadurch ist Pin9 frei. Ein 10k-Widerstand (R4a) gegen GND als PullDown und ein Drähtchen zwischen Pin9 und dem freien Pin am Stecker 1 (CON1). Auf der Hauptplatine ist diese freie Steckerverbindung schon vorgesehen, neben Con3 gibt es ein freies Lötauge das mit "free" bezeichnet ist. Von hier geht's nach X1:5 und weiter nach Mega8:16 (OC1B, PWM-Rechts). IC1:1 geht nach Mega8:15 (OC1A, PWM-Links) mit PullDown R4. Richtungsauswahl sind am Mega8 PB4 (X1:18) und PB5 (X1:19). Was dann links oder rechts ist muss ich noch austesten;) Beim Probelauf zeigte sich, dass MR+ nicht an Pin7 von IC1 angeschlossen ist...

    Taster:
    Um Pins zu sparen habe ich die Taster (gegen GND schaltend) parallel zu den ODO-Transistoren T3/T4 angeschlossen (Mega8:23/24, ADC0/1). Die Idee dahinter: Wenn man eine Taste drückt sollte der Antrieb stehen und keine OdoWerte liefern. Mit dem ADC sollte der Unterschied zwischen Fototransistor und Taster ermittelt werden können (vielleicht sogar einfach nur digital ohne ADC;)

    LEDS:
    Die LEDs D14/15 sind (vorläufig) an den gesparten Motorpins angeschlossen. Somit haben alle vier LEDs einen eigenen Pin (den man später auch als freien Portpin nutzen könnte):
    D12-PD2 (StatusLED red)
    D13-PB0 (StatusLED green)
    D14-PD3
    D15-PD4

    Speaker (X1:4) und rechte IR-LEDs (X2:14):
    Diese habe ich beide an Mega8:11 (PD5). Besser wäre wohl ein Pintausch mit PB0. Dann könnte man D12-15 über PD2-5 ansprechen. (Schön, dass wir darüber gesprochen haben *lol*)

    Sonstiges:
    Ärgerlich ist, dass der ProBot die LEDs gegen Vcc schaltet. Beim Zusammenbau unbedingt die Anleitung befolgen! Die Ladekurve von C2(22µF an 12K) ist so flach, dass der asuro-Bootlader beim Starten VL erkennt. Lösung: C2 entfernen. Die LEDs D12-15 mit 1k-Vorwiderstand sind deutlich heller als D5 (1,5k). 7,5k währen wohl zuviel. Getrennte Motorversorgung war auch mein erster Gedanke als ich den L293D gesehen hatte. Besser wäre grundsätzlich die Batterie an der Motor-Platine anzuschliesen (mit Schalter, Led und Ladebuchse. Dann würde der Motorstrom nicht über Hauptplatine und CON3/1 fließen und die Hauptplatine wäre spannungsfrei wenn man CON1/3 unterbricht. Allerdings müßte dann jede andere (selbstgebaute) Motorplatine ihre eigene Spannungsversorgung mitbringen. *grins*

    Bisher ein großes Fummeln, schön wäre eine geätzte Platine. Jetzt biege ich mal die Lib zurecht, ein neuer Selbsttest muss auch her. Es gibt noch viel zu erforschen...

    Gruß

    mic

    [Edit]
    Das klappt ja schon prima:
    Bild hier   Bild hier   Bild hier   Bild hier  
    http://www.youtube.com/watch?v=AoFFV_OtUzw
    http://www.youtube.com/watch?v=mE18QeMeH4M
    http://www.youtube.com/watch?v=T_XtO6FwsJk
    http://www.youtube.com/watch?v=bLftu-9mhl0
    Bild hier  
    Atmel’s products are not intended, authorized, or warranted for use
    as components in applications intended to support or sustain life!

  8. #18
    Moderator Robotik Visionär Avatar von radbruch
    Registriert seit
    27.12.2006
    Ort
    Stuttgart
    Alter
    61
    Beiträge
    5.799
    Blog-Einträge
    8
    Hallo

    Ein kleines Video gefällig?

    Bild hier  
    http://www.youtube.com/watch?v=Hmy_6wn5HFg

    Das einfache "links dunkler als rechts"-Programm:
    Code:
    // Einfaches Linienfolgen mit dem asuro-ProBot                             30.8.09 mic
    
    #include "selftest.h"
    
    void Init(void);
    void Sleep(unsigned char time36kHz);
    void Msleep(int dauer);
    void SerWrite(unsigned char *data,unsigned char length);
    void PrintInt(int wert);
    void PrintBin(char wert);
    inline void StatusLED(unsigned char color);
    inline void FrontLED(unsigned char status);
    void BackLED(unsigned char left, unsigned char right);
    inline void MotorSpeed(unsigned char left_speed, unsigned char right_speed);
    inline void MotorDir(unsigned char left_dir, unsigned char right_dir);
    void LineData(unsigned int *data);
    inline void StatusLED(unsigned char color);
    void SetLEDs(unsigned char status);
    
    int main(void) {
    
    	unsigned int data[2];
    	//unsigned char i;
    
    	Init();
    	SerWrite("\n\rasuro-ProBot-Linienfolgen\n\r",29);
    	SerWrite("30.8.09 mic \n\r", 14);
    	DDRD |= (1<<PD2) | (1<<PD3) | (1<<PD4) | (1<<PD5) | (1<<PD6); // D12-15 und FrontLED
    	PORTD |= (1<<PD2) | (1<<PD3) | (1<<PD4) | (1<<PD5) | (1<<PD6); // high bedeutet LEDs aus
    	//PORTD &= ~((1<<PD2) | (1<<PD3) | (1<<PD4) | (1<<PD5)); // D12-15 an
    	//SetLEDs(0b11111); // FrontLED, D14(red), D15, D13, D12(green)
    
    	FrontLED(ON);
    	MotorSpeed(225,225);
    	while(1)
    	{
    		LineData(data);
    		if(data[0]<data[1]) MotorSpeed(200,250); else MotorSpeed(250,200);
    /*
    		PrintInt(data[0]);
    		SerWrite("- ", 2);
    		PrintInt(data[1]);
    		SerWrite("\n\r", 2);
    		Msleep(100);
    */
    		Sleep(255);
    	}
    	return(0); // wird nie erreicht!
    }
    
    volatile unsigned char count36kHz;
    volatile unsigned long timebase;
    
    /* uses timer2 (36kHz for IR communication */
    SIGNAL (SIG_OVERFLOW2)
    {
    	TCNT2 += 0x25;
    	count36kHz ++;
    	if (!count36kHz) timebase ++;
    }
    
    void Init (void)
    {
    	//-------- seriell interface programmed in boot routine and already running -------
    	//  prepare 36kHz for IR - Communication
    	TCCR2 = (1 << WGM20) | (1 << WGM21) | (1 << COM20) | (1 << COM21) | (1 << CS20);
    	OCR2  = 0x91; // duty cycle for 36kHz
    	TIMSK |= (1 << TOIE2); // 36kHz counter for sleep
    
    	// prepare RS232
    	UCSRA = 0x00;
    	UCSRB = 0x00;
    	UCSRC = 0x86; // No Parity | 1 Stop Bit | 8 Data Bit
    	UBRRL = 0xCF; // 2400bps @ 8.00MHz
    
    	// I/O Ports
    	DDRB = IRTX | LEFT_DIR | PWM | GREEN_LED;
    	//DDRD = RIGHT_DIR | FRONT_LED | ODOMETRIE_LED | RED_LED;
    
    	// for PWM (8-Bit PWM) on OC1A & OC1B
    	TCCR1A = (1 << WGM10) | (1 << COM1A1) | (1 << COM1B1);
    	// tmr1 running on MCU clock/8
    	TCCR1B = (1 << CS11);
    
    	// A/D Conversion
    	ADCSRA = (1 << ADEN) | (1 << ADPS2) | (1 << ADPS1); // clk/64
    	ODOMETRIE_LED_OFF;
    
    	StatusLED(GREEN);
    	MotorDir(FWD,FWD);
    	MotorSpeed(0,0);
    	sei();
    }
    
    void Sleep(unsigned char time36kHz)
    {   unsigned char ziel=(time36kHz+count36kHz) & 0x00FF;
    	while (count36kHz != ziel);
    }
    
    void Msleep(int dauer)
    {
    	while(dauer--) Sleep(36);
    }
    
    void SerWrite(unsigned char *data,unsigned char length)
    {
    	unsigned char i = 0;
    	UCSRB = 0x08; // enable transmitter
    	while (length > 0) {
    		if (UCSRA & 0x20) { // wait for empty transmit buffer
    			UDR = data[i++];
    			length --;
    		}
    	}
    	while (!(UCSRA & 0x40));
    	for (i = 0; i < 0xFE; i++)
    		for(length = 0; length < 0xFE; length++);
    }
    
    void PrintInt(int wert)
    {  char text[6]="      ";
    	itoa(wert,text,10);
    	SerWrite(text,5);
    }
    void PrintBin(char wert)
    {  char text[8]="        ";
    	itoa(wert,text,2);
    	SerWrite(text,8);
    }
    
    /* Set motor speed */
    inline void MotorSpeed(unsigned char left_speed, unsigned char right_speed)
    {
    	OCR1A = left_speed;
    	OCR1B = right_speed;
    }
    
    /* Set motor direction */
    inline void MotorDir(unsigned char left_dir, unsigned char right_dir)
    {
    	if(left_dir)  PORTB &= ~(1 << PB5); else PORTB |= (1 << PB5);
    	if(right_dir) PORTB &= ~(1 << PB4); else PORTB |= (1 << PB4);
    }
    void LineData(unsigned int *data)
    {
    	ADMUX = (1 << REFS0) | IR_LEFT;	// AVCC reference with external capacitor
    	Sleep(10);
    	ADCSRA |= (1 << ADSC);			// Start conversion
    	while (!(ADCSRA & (1 << ADIF)));	// wait for conversion complete
    	ADCSRA |= (1 << ADIF);			// clear ADCIF
    	data[0] = ADCL + (ADCH << 8);
    
    	ADMUX = (1 << REFS0) | IR_RIGHT;	// AVCC reference with external capacitor
    	Sleep(10);
    	ADCSRA |= (1 << ADSC);			// Start conversion
    	while (!(ADCSRA & (1 << ADIF)));	// wait for conversion complete
    	ADCSRA |= (1 << ADIF);			// clear ADCIF
    	data[1] = ADCL + (ADCH << 8);
    }
    inline void StatusLED(unsigned char color)
    {
    	if (color == OFF)    {GREEN_LED_OFF; RED_LED_OFF;}
    	if (color == GREEN)  {GREEN_LED_ON; RED_LED_OFF;}
    	if (color == YELLOW) {GREEN_LED_ON; RED_LED_ON;}
    	if (color == RED)    {GREEN_LED_OFF; RED_LED_ON;}
    }
    void SetLEDs(unsigned char status)
    {
    	status = ~(status<<2);		// LEDs sind PD2-7 gegen Vcc schaltend!
    	PORTD &= status;           // nur gesetzte LEDs einschalten
    	PORTD |= status & ~3;		// PD0 und PD1 nicht verändern!
    }
    inline void FrontLED(unsigned char status)
    {
    	if(status) FRONT_LED_on; else FRONT_LED_off;
    }
    Und die Header-Datei dazu:
    Code:
    // Einfaches Linienfolgen mit dem asuro-ProBot                             30.8.09 mic
    
    #include <avr/io.h>
    #include <avr/interrupt.h>
    #include <stdlib.h>
    
    #define  FALSE	0
    #define  TRUE	1
    
    #define  OFF    0
    #define  ON     1
    
    #define GREEN	1
    #define RED		2
    #define YELLOW  3
    
    /* --------------- INTERNAL ------------- */
    #define GREEN_LED_OFF  PORTD |=  GREEN_LED
    #define GREEN_LED_ON PORTD &= ~GREEN_LED
    #define RED_LED_OFF    PORTD |=  RED_LED
    #define RED_LED_ON   PORTD &= ~RED_LED
    
    #define FWD 0
    #define RWD 1
    #define BREAK	0x00
    #define FREE	(1 << PB4) | (1 << PB5) /* (1 << PD4) | (1 << PD5)*/
    
    #define IRTX        (1 << PB3)
    #define GREEN_LED   (1 << PD5)
    #define RED_LED     (1 << PD2)
    
    #define PWM 	  (1 << PB1) | (1 << PB2)
    #define RIGHT_DIR (1 << PB4) | (1 << PB5)
    #define LEFT_DIR  (1 << PD4) | (1 << PD5)
    
    #define BATTERIE  (1 << MUX0) | (1 << MUX2) //ADC5
    #define SWITCH    (1 << MUX2)							//ADC4
    #define IR_LEFT	  (1 << MUX0) | (1 << MUX1)	//ADC3
    #define IR_RIGHT  (1 << MUX1)							//ADC2
    
    #define Speaker (1 << PD5) // speaker an D14
    #define Speaker_on PORTD &= ~(1<<PD5)
    #define Speaker_off PORTD |= (1<<PD5)
    
    #define FRONT_LED (1 << PD6)
    #define FRONT_LED_on PORTD &= ~(1<<PD6)
    #define FRONT_LED_off PORTD |= (1<<PD6)
    
    #define ODOMETRIE_LED 	  (1 << PD7)
    #define ODOMETRIE_LED_ON  PORTD |= ODOMETRIE_LED
    #define ODOMETRIE_LED_OFF PORTD &= ~ODOMETRIE_LED
    
    #define WHEEL_LEFT   (1 << MUX0)			//ADC1
    #define WHEEL_RIGHT  0					//ADC0
    
    #define LED12_on PORTD &= ~(1<<PD2)
    #define LED13_on PORTD &= ~(1<<PD3)
    #define LED14_on PORTD &= ~(1<<PD5) // Achtung Reihenfolge D14/15 getauscht!
    #define LED15_on PORTD &= ~(1<<PD4)
    
    #define LED12_off PORTD |= (1<<PD2)
    #define LED13_off PORTD |= (1<<PD3)
    #define LED14_off PORTD |= (1<<PD5)
    #define LED15_off PORTD |= (1<<PD4)
    :)

    btw kann ich den Motortreiberumbau nur empfehlen.

    Gruß

    mic
    Bild hier  
    Atmel’s products are not intended, authorized, or warranted for use
    as components in applications intended to support or sustain life!

  9. #19
    Benutzer Stammmitglied
    Registriert seit
    08.12.2008
    Ort
    Germering
    Beiträge
    37
    Hi mic,
    ich verfolge dein Projekt von Beginn an mit großem Interesse.
    Habe auch Asuro und ProBot128 erfolgreich zusammengelötet.

    Meine Frage betrifft deine Mod zum Motortreiber:
    Funktioniert die auch, nebenwirkungsfrei, mit der C-Control Pro128?

    Programmierung des ProBot128 mit der Asuro USB-IR-Methode wäre
    auch eine gute Sache denn mein Voltcraft-Programmierer hat den Geist aufgegeben.
    Wenn ich den ProBot128 neu programmieren will, muß ich ihn in das Application Board stecken (oder einen neuen Voltcraft kaufen, brrrrrr...).

    Weiterhin viel Erfolg mit deinem interessanten Projekt
    Olaf

  10. #20
    Moderator Robotik Visionär Avatar von radbruch
    Registriert seit
    27.12.2006
    Ort
    Stuttgart
    Alter
    61
    Beiträge
    5.799
    Blog-Einträge
    8
    Hallo

    Die Motortreibermodifikation ist beim C-Control Pro128 nicht ganz so einfach, weil die Leitungen hier direkt auf die Kontrollerpins gehen. Neben der Änderung auf der Motorplatine müssen deshalb auch die Enable/PWM-Leitungen getauscht werden. Zusätzlich muss natürlich in der Library des ProBot die Ansteuerung geändert werden.

    Zum Tauschen der Leitungen würde sich das Verbindungskabel von CON1 nach CON3 anbieten. Hier könnte man auf einer Seite das Flachkabel in drei Pärchen auftrennen: Vcc+GND, OC1A und Enable(orginal), OC1B und Enable (neu). Vcc und GND bleiben, die anderen beiden Pärchen werden in der Steckerquetschung getauscht. Dann gehen die PWM-Pins des Kontrollers auf die Enable-Leitungen von IC1 und die Richtungsauswahlen gehen auf IC2.

    Die Anpassung der Lib und eventuelle Auswirkungen auf die Programme habe ich noch nicht untersucht. Das sollte aber auch eher ein C-Control Pro128-Benutzer tun ;)

    Kleine Fortschritte gibt es auch bei meinem Projekt, ich experimentiere mit dem ACS:
    Bild hier   Bild hier   Bild hier  
    http://www.youtube.com/watch?v=0EVu3qImZ0k
    http://www.youtube.com/watch?v=ri9kHphFiPI
    http://www.youtube.com/watch?v=5exIBE11L04


    Die IR-LEDs sind noch nicht mit Schrumpfschlauch abgedeckt.

    Aktuelle Software:
    Code:
    // ACS-Test                                                           12.9.09 mic
    
    #include "asuro-probot.h"
    #include "asuro-probot.c"
    
    unsigned int data[2];
    
    int main(void)
    {
    	Init();
    	FrontLED(ON);
    	while(1)
    	{
    
    		ACSData(data);
    		MotorSpeed(255,245); // linker Motor schwächelt ;)
    		if(data[0] > 244) MotorSpeed(255,0);
    		if(data[1] > 244) MotorSpeed(0,245);
    		if((data[0]>248) && (data[1]>248)) MotorSpeed(0,0);
    		Msleep(300);
    	}
    	return(0);
    }
    Die Lib dazu:
    Code:
    // asuro-ProBot-Lib asuro-probot.c                                   12.9.09 mic
    
    volatile unsigned char count36kHz=0;
    volatile unsigned char acs=0;
    volatile unsigned long timebase=0;
    
    /* uses timer2 (36kHz for IR communication */
    SIGNAL (SIG_OVERFLOW2)
    {
    	TCNT2 += 0x25;
    	count36kHz ++;
    	if (!count36kHz) timebase ++;
    	if(acs) acs--;
    }
    
    void Sleep(unsigned char time36kHz)
    {   unsigned char ziel=(time36kHz+count36kHz) & 0x00FF;
    	while (count36kHz != ziel);
    }
    
    void Msleep(int dauer)
    {
    	while(dauer--) Sleep(36);
    }
    
    void SerWrite(unsigned char *data,unsigned char length)
    {
    	unsigned char i = 0;
    	UCSRB = 0x08; // enable transmitter
    	while (length > 0) {
    		if (UCSRA & 0x20) { // wait for empty transmit buffer
    			UDR = data[i++];
    			length --;
    		}
    	}
    	while (!(UCSRA & 0x40));
    	for (i = 0; i < 0xFE; i++)
    		for(length = 0; length < 0xFE; length++);
    }
    
    void PrintInt(int wert)
    {  char text[6]="      ";
    	itoa(wert,text,10);
    	SerWrite(text,5);
    }
    void PrintBin(char wert)
    {  char text[8]="        ";
    	itoa(wert,text,2);
    	SerWrite(text,8);
    }
    
    /* Set motor speed */
    inline void MotorSpeed(unsigned char left_speed, unsigned char right_speed)
    {
    	OCR1A = left_speed;
    	OCR1B = right_speed;
    }
    
    /* Set motor direction */
    inline void MotorDir(unsigned char left_dir, unsigned char right_dir)
    {
    	if(left_dir)  PORTB &= ~(1 << PB5); else PORTB |= (1 << PB5);
    	if(right_dir) PORTB &= ~(1 << PB4); else PORTB |= (1 << PB4);
    }
    void LineData(unsigned int *data)
    {
    	ADMUX = (1 << REFS0) | IR_LEFT;	// AVCC reference with external capacitor
    	Sleep(10);
    	ADCSRA |= (1 << ADSC);			// Start conversion
    	while (!(ADCSRA & (1 << ADIF)));	// wait for conversion complete
    	ADCSRA |= (1 << ADIF);			// clear ADCIF
    	data[0] = ADCL + (ADCH << 8);
    
    	ADMUX = (1 << REFS0) | IR_RIGHT;	// AVCC reference with external capacitor
    	Sleep(10);
    	ADCSRA |= (1 << ADSC);			// Start conversion
    	while (!(ADCSRA & (1 << ADIF)));	// wait for conversion complete
    	ADCSRA |= (1 << ADIF);			// clear ADCIF
    	data[1] = ADCL + (ADCH << 8);
    }
    void OdometrieData(unsigned int *data)
    {
    	DDRC &= ~((1 << PC0) | (1 << PC1)); // Input => no break LED
    	ODOMETRIE_LED_ON;
    	Sleep(5);
    
    	ADMUX = (1 << REFS0) | WHEEL_LEFT; // AVCC reference with external capacitor
    	ADCSRA |= (1 << ADSC);			// Start conversion
    	while (!(ADCSRA & (1 << ADIF)));	// wait for conversion complete
    	ADCSRA |= (1 << ADIF);			// clear ADCIF
    	data[0] = ADCL + (ADCH << 8);
    
    	ADMUX = (1 << REFS0) | WHEEL_RIGHT; // AVCC reference with external capacitor
    	ADCSRA |= (1 << ADSC);			// Start conversion
    	while (!(ADCSRA & (1 << ADIF)));	// wait for conversion complete
    	ADCSRA |= (1 << ADIF);			// clear ADCIF
    	data[1] = ADCL + (ADCH << 8);
    }
    void ACSData(unsigned int *data)
    {
    	UCSRB &= ~(1<<TXEN); // USART TX disable
    
    	OCR2=0xff;
    	DDRD |= (1<<PD1);
    	PORTD &= ~(1<<PD1); // ACS LED left on
    	while(PIND & 1)
    	{
      		acs=15;
    		while(acs);
    		OCR2--;
    	}
    	PORTD |= (1<<PD1); // ACS LED left  off
    	data[0]=OCR2;
    	while(!(PIND &1));
    
    	OCR2=0xff;
    	PORTB &= ~(1<<PB0); // ACS LED right on
    	while(PIND & 1)
    	{
      		acs=15;
    		while(acs);
    		OCR2--;
    	}
    	PORTB |= (1<<PB0); // ACS LED right  off                            6
    	data[1]=OCR2;
    	while(!(PIND &1));
    
    	OCR2=0x91; //36kHz
    }
    inline void StatusLED(unsigned char color)
    {
    	if (color == OFF)    {GREEN_LED_OFF; RED_LED_OFF;}
    	if (color == GREEN)  {GREEN_LED_ON; RED_LED_OFF;}
    	if (color == YELLOW) {GREEN_LED_ON; RED_LED_ON;}
    	if (color == RED)    {GREEN_LED_OFF; RED_LED_ON;}
    }
    void SetLEDs(unsigned char status)
    {
    	status = ~(status<<2);		// LEDs sind PD2-7 gegen Vcc schaltend!
    	PORTD &= status;           // nur gesetzte LEDs einschalten
    	PORTD |= status & ~3;		// PD0 und PD1 nicht verändern!
    }
    inline void FrontLED(unsigned char status)
    {
    	if(status==ON) FRONT_LED_on; else FRONT_LED_off;
    }
    unsigned char PollSwitch (void)
    {
    	ODOMETRIE_LED_OFF;
    	Sleep(10);
    	return(~PINC & 3);
    }
    void Init (void)
    {
    	//-------- seriell interface programmed in boot routine and already running -------
    	//  prepare 36kHz for IR - Communication
    	TCCR2 = (1 << WGM20) | (1 << WGM21) | (1 << COM20) | (1 << COM21) | (1 << CS20);
    	OCR2  = 0x91; // duty cycle for 36kHz
    	TIMSK |= (1 << TOIE2); // 36kHz counter for sleep and ACS
    
    	// prepare RS232
    	UCSRA = 0x00;
    	UCSRB = 0x00;
    	UCSRC = 0x86; // No Parity | 1 Stop Bit | 8 Data Bit
    	UBRRL = 0xCF; // 2400bps @ 8.00MHz
    
    	// I/O Ports
    	DDRB = IRTX | RIGHT_DIR | LEFT_DIR | PWM;
    	// PD2-5=D12-15, PD6=FrontLED und PD7=OdoLED, alle LEDs ausschalten
       DDRD |= (1<<PD7) | (1<<PD6) | (1<<PD5) | (1<<PD4) | (1<<PD3) | (1<<PD2);
       PORTD|= (0<<PD7) | (1<<PD6) | (1<<PD5) | (1<<PD4) | (1<<PD3) | (1<<PD2);
    
    	// for PWM (8-Bit PWM) on OC1A & OC1B
    	TCCR1A = (1 << WGM10) | (1 << COM1A1) | (1 << COM1B1);
    	// tmr1 running on MCU clock/8
    	TCCR1B = (1 << CS11);
    
    	// A/D Conversion
    	ADCSRA = (1 << ADEN) | (1 << ADPS2) | (1 << ADPS1); // clk/64
    	
    	//ACS-Init (muss noch gecheckt werden
    	DDRB |= (1<<PB3); // OC2 (36kHz an Timer2)
    	//DDRD |= (1<<PD1); // ACS_LED_LEFT (TXD)
    	DDRB |= (1<<PB0); // ACS_LED_RIGHT
    	PORTB |= (1<<PB0); // off
    	//PORTB &= ~(1<<PB0); // on
    
    	//ODOMETRIE_LED_OFF;
    	StatusLED(GREEN);
    	MotorDir(FWD,FWD);
    	MotorSpeed(0,0);
    	sei();
    }
    Code:
    // asuro-ProBot-Lib asuro-probot.h                                   12.9.09 mic
    
    #include <avr/io.h>
    #include <avr/interrupt.h>
    #include <stdlib.h>
    
    #define  FALSE	0
    #define  TRUE	1
    
    #define  OFF    0
    #define  ON     1
    
    #define GREEN	1
    #define RED		2
    #define YELLOW  3
    
    /* --------------- INTERNAL ------------- */
    #define GREEN_LED_OFF  PORTD |=  GREEN_LED
    #define GREEN_LED_ON PORTD &= ~GREEN_LED
    #define RED_LED_OFF    PORTD |=  RED_LED
    #define RED_LED_ON   PORTD &= ~RED_LED
    
    #define FWD 0
    #define RWD 1
    #define BREAK	0x00
    #define FREE	(1 << PB4) | (1 << PB5) /* (1 << PD4) | (1 << PD5)*/
    
    #define GREEN_LED   		(1 << PD2)
    #define RED_LED     		(1 << PD3)
    
    #define PWM 	  	(1 << PB1) | (1 << PB2)
    #define IRTX      (1 << PB3)
    #define RIGHT_DIR (1 << PB4)
    #define LEFT_DIR  (1 << PD5)
    
    #define BATTERIE  (1 << MUX0) | (1 << MUX2) 	//ADC5
    #define SWITCH    (1 << MUX2)						//ADC4
    #define IR_LEFT	(1 << MUX0) | (1 << MUX1)	//ADC3
    #define IR_RIGHT  (1 << MUX1)						//ADC2
    
    #define ACS_RIGHT_LED   (1 << PB0)
    #define ACS_LEFT_LED    (1 << PD1)
    #define ACS_RIGHT_LED_on 	PORTB &= ~ACS_RIGHT_LED
    #define ACS_RIGHT_LED_off 	PORTB |=  ACS_RIGHT_LED
    #define ACS_LEFT_LED_on 	PORTD &= ~ACS_LEFT_LED
    #define ACS_LEFT_LED_off 	PORTD |=  ACS_LEFT_LED
    
    #define Speaker (1 << PD5) // speaker an D14
    #define Speaker_on PORTD &= ~(1<<PD5)
    #define Speaker_off PORTD |= (1<<PD5)
    
    #define FRONT_LED (1 << PD6)
    #define FRONT_LED_on PORTD &= ~(1<<PD6)
    #define FRONT_LED_off PORTD |= (1<<PD6)
    
    #define ODOMETRIE_LED 	  (1 << PD7)
    #define ODOMETRIE_LED_ON  PORTD |= ODOMETRIE_LED
    #define ODOMETRIE_LED_OFF PORTD &= ~ODOMETRIE_LED
    
    #define WHEEL_LEFT   (1 << MUX0)			//ADC1
    #define WHEEL_RIGHT  0					//ADC0
    
    #define LED12_on PORTD &= ~(1<<PD2)
    #define LED13_on PORTD &= ~(1<<PD3)
    #define LED14_on PORTD &= ~(1<<PD5) // Achtung Reihenfolge D14/15 getauscht!
    #define LED15_on PORTD &= ~(1<<PD4)
    
    #define LED12_off PORTD |= (1<<PD2)
    #define LED13_off PORTD |= (1<<PD3)
    #define LED14_off PORTD |= (1<<PD5)
    #define LED15_off PORTD |= (1<<PD4)
    Gruß

    mic
    Bild hier  
    Atmel’s products are not intended, authorized, or warranted for use
    as components in applications intended to support or sustain life!

Seite 2 von 3 ErsteErste 123 LetzteLetzte

Berechtigungen

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

MultiPlus Wechselrichter Insel und Nulleinspeisung Conrad