-
hi radbruch,
nun machst Du also doch Ernst mit deinem Namen und verabschiedest dich von drehenden Vortriebselementen...?
Feines Projekt!
Bin mal gespannt, wo es hinläuft...
Mal was anderes:
Habe letzens beim Surfen (leider den Link nicht mehr da) einen Zweibeiner gesehen.
Die Füße waren mit Unterdruck-Saugnäpfen versehen.
Die Beine standen in Ruhe wie beim Spagat auseinander.
Lange Rede, kurzer Sinn:
Das Teil ist mit Hilfe der Saugnäpfe prima gelaufen!
Wände, Treppen, Decken - solang halbwegs glatt - kein Problem.
Hat auch toll ausgesehen, so ein "nur-Beiner".
Gruß, Klingon77
-
Hallo
Es freut mich sehr, dass euch mein kleines Projekt so viel Freude bereitet. Eigentlich sollte es nur dazu dienen, Servos für einen Roboterarm zu beherrschen. Aber es verselbständigt sich zunehmend. Hier nun der neuste Stand des Projekts.
Nachdem ich lange genug gejammert hatte, wurde mir von der besten Ehefrau von allen ein USB-ISP-Interface genehmigt. *juhu* Das Teil (ein mysmartusb für 30€) wurde gestern geliefert. Hier nun die ersten Videos und Pics nach dem Abnabeln vom RP6:
Bild hier Bild hier Bild hier
http://www.youtube.com/watch?v=6ZNNRiDPIao
http://www.youtube.com/watch?v=dHDhgpYCXm0
http://www.youtube.com/watch?v=Z7gb-9V5KY4
Orginalvideos: 1 2 3 4
Nach meinem heutigen ISP- und ATtiny-Marathon steuert nun ein ATtiny13 den Roboter. Bei 1,2MHz CPU-Taktfrequenz werden die Servos mit einer Counter-ISR angesteuert. Der Code hat im Moment 516 Bytes:
Code:
#include <avr/io.h>
#include <avr/interrupt.h>
#define x_mitte 17
#define y_mitte 17
#define z_mitte 17
unsigned int x, y, z, demo;
void delay(uint16_t d) // Warteschleife
{
uint16_t d1, dummy;
for (d1=d; d1>0; d1--) dummy^=d1;
}
ISR(TIM0_COMPA_vect) // Servoansteuerung
{
static uint16_t count=0;
if (count>x) PORTB &= ~(1<<PB0); else PORTB |= (1<<PB0);
if (count>y) PORTB &= ~(1<<PB1); else PORTB |= (1<<PB1);
if (count>z) PORTB &= ~(1<<PB2); else PORTB |= (1<<PB2);
if (count < 200) count++; else count=0;
}
int main(void)
{
x=x_mitte; // Servos Basisposition
y=y_mitte;
z=z_mitte;
demo=5; // 5 Einzelschritte
DDRB = (1<<PB2) | (1<<PB1) | (1<<PB0); // Servoausgänge
PORTB= (1<<PB3); // PullUp Taster ein
TCCR0A = (0 << WGM00) | (1 << WGM01); // CTC-Mode
TCCR0A |= (0 << COM0A0) | (0 << COM0A1); // ohne OCR-Pin
TCCR0B = (0 << CS02) | (0 << CS01) | (1 << CS00); // no prescaler
TIMSK0 = (1 << OCIE0A); // Interrupt ein
OCR0A = 50; // nicht wissenschaltliche Frequenz
sei();
while(1)
{
y=y_mitte+4; delay(400); // Schritt
if (demo) while(PINB & (1<<PB3)); // warten auf Taste
for (; x>x_mitte-12; x--)
{
if (x==5) y=y_mitte+7;
if (x==0) y=y_mitte+5;
if (x==-11) y=y_mitte+3;
delay(120+x);
}
x=x_mitte-15; y=y_mitte+4; delay(100);
y=y_mitte; delay(300);
x=x_mitte+5; delay(1000);
if (demo) demo--;
}
return(0);
}
Lager für die Gelenke sind übrigens Reiszwecken:
Bild hier
Bild hier Bild hier Bild hier Bild hier
Gruß
mic
-
Hei, irre gut. Find ich herrlich kreativ!! Hat das Ding schon einen Namen? z.B. ALFd ?? (A dvanced L octite F ischertechnik design).
Und ich ](*,) popel immer noch mehr oder weniger mit "Trockenübungen" herum ](*,)
-
Ist ja geil das Board hab ich auch, und ich Idiot hab noch nicht damit gearbeitet! Ich kann gar nicht glauben was damit alles möglich ist, fetter Respekt. Ne Idee schnell, unkompliziert und vor allem Zweckmäßig umgesetzt.
-
Hallo
Ein kleines Update der Steuerplatine:
Bild hier
- ein 100uF-Kondensator hilft bei schwachen Akkus die Anlaufströme der Servos zu verkraften.
- 2,2k-Widerstände in den Servo-Impuls-Leitungen.
- Zusätzlicher Jumper trennt GND der Servos um ein Zucken beim Flashen zu verhindern.
- gedrehte hohe ISP-Buchsen.
- Testanschluß für zwei weitere Pins.
Diesen "Boxenstopp" nutzte ich noch für einen kleinen Versuch. Ich nenne ihn "Kippler":
Bild hier Bild hier Bild hier Bild hier
Das Teil besteht aus:
- Der Steuerplatine mit ATtiny13
- Zwei kleine und ein großer 5€-Servos
- Vier Akkus(900mA) mit Halter
- 9V-Batterieklipp
- Servoanschlußadapter vom Einbein
- Zwei Schraubdeckel
- Heißkleber (und zwei Kabelbinder weil die Federn im Akkuhalter diesen auseinanderdrücken)
Selbstverständlich gibt's auch wieder ein Video:
Bild hier
http://www.youtube.com/watch?v=5ZSN3rLdAOM
Hier noch der Code (mit EEProm-Routinen zum Debugen 534Bytes):
Code:
// steuert den Wankenden, 1. Versuch
#include <avr/io.h>
#include <avr/interrupt.h>
#define x_mitte 27
#define y_mitte 27
#define z_mitte 25
#define schritt 15
#define kipp 4
unsigned char x, y, z, demo, count;
unsigned char linie_links, linie_rechts;
int eeprom_adr;
void delay(uint16_t d) // Warteschleife
{
uint16_t d1, dummy;
for (d1=d; d1>0; d1--) dummy^=d1;
}
ISR(TIM0_COMPA_vect) // Servoansteuerung
{
if (count>x) PORTB &= ~(1<<PB0); else PORTB |= (1<<PB0);
if (count>y) PORTB &= ~(1<<PB1); else PORTB |= (1<<PB1);
if (count>z) PORTB &= ~(1<<PB2); else PORTB |= (1<<PB2);
if (count < 200) count++; else count=0;
}
void EEPROM_write(unsigned char ucAddress, unsigned char ucData)
{
/* Wait for completion of previous write */
while(EECR & (1<<EEPE));
/* Set Programming mode */
EECR = (0<<EEPM1)|(0>>EEPM0);
/* Set up address and data registers */
EEARL = ucAddress;
EEDR = ucData;
/* Write logical one to EEMPE */
EECR |= (1<<EEMPE);
/* Start eeprom write by setting EEPE */
EECR |= (1<<EEPE);
}
unsigned char EEPROM_read(unsigned char ucAddress)
{
/* Wait for completion of previous write */
while(EECR & (1<<EEPE));
/* Set up address register */
EEARL = ucAddress;
/* Start eeprom read by writing EERE */
EECR |= (1<<EERE);
/* Return data from data register */
return EEDR;
}
int main(void)
{
x=x_mitte; // Servos Basisposition
y=y_mitte;
z=z_mitte;
demo=3; // 5 Einzelschritte
eeprom_adr=2; // ersten Speicherstelle
DDRB = (1<<PB2) | (1<<PB1) | (1<<PB0); // Servoausgänge
PORTB= (1<<PB3); // PullUp Taster ein
TCCR0A = (0 << WGM00) | (1 << WGM01); // CTC-Mode
TCCR0A |= (0 << COM0A0) | (0 << COM0A1); // ohne OCR-Pin
TCCR0B = (0 << CS02) | (0 << CS01) | (1 << CS00); // no prescaler
TIMSK0 = (1 << OCIE0A); // Interrupt ein
OCR0A = 50; // nicht wissenschaltliche Frequenz
sei();
while(PINB & (1<<PB3)); // warten auf Taste
while(1) {
while(z-- > z_mitte-kipp) delay(150);
delay(5000);
y=y_mitte+schritt;
while(x++ < x_mitte+schritt) delay(100);
delay(1000);
while(z++ < z_mitte+kipp) delay(150);
delay(5000);
x=x_mitte-schritt;
while(y-- > y_mitte-schritt) delay(100);
delay(1000);
if(demo) demo--; else
{
while(z-- > z_mitte-kipp) delay(150);
delay(5000);
y=y_mitte+schritt;
delay(1000);
while(z++ < z_mitte+kipp) delay(150);
delay(5000);
x=x_mitte-schritt;
while(y-- > y_mitte-schritt) delay(100);
delay(1000);
demo=3;
}
}
return(0);
}
Gruß
mic
-
Super Sache!
Der Kippler gefällt mir .. ulkig .. mal was ganz anderes ... Hmmm .. da fehlen dann nur noch kreisende Umgebungssensoren und eine Möglichkeit Hindernisse zu überwinden ... klasse! Viel Spaß weiterhin!
-
Das is n Spitze Projekt, komme ausm Schmunzeln garnicht mehr raus =D>
Erinnert mich an eine Comicfigur :mrgreen:
-
Hallo
Für die Kippler-Fans hier noch ein letztes Video. Ich muss ihn leider wieder zerlegen, weil ich die Teile brauche.
Für Erweiterungen wie Radar oder Fernbedienung ist der tiny13 vermutlich zu klein.
Die kurzen Stopps im Video werden von den 9V-Klipps verursacht; durch Erschütterung kurzer Spannungsausfall. Hier werde ich wohl auf Modelbaustecker umrüsten.
Bild hier
http://www.youtube.com/watch?v=j334i_YCwoI
Orginales 12MB-mpeg
Gruß
mic
-
Klasse && schade! Bist Du Schotte? So'n geniales Bürschchen töten :-(
-