Zurück
(C) Christof Ermer, Regensburg
Tumblr Online Counter
8.07.2014
Dies ist einzig und allein ein Merkzettel für meine Arbeit und sonstiges.
was ist ein quarter scale servo ?
https://www.youtube.com/watch?v=U80haLr5qZ0
5x7-Dot-Matrix-Ansteuerung mit dem MAX7219 (für PIC-Mikrocontroller, Elektronik)
3.99€
MAX 7219 CNG
http://www.stefan-buchgeher.info/elektronik/max7219/max7219_dot_matrix_kap3.html
Praktische Arbeits oder Ausführungstips:
Praktisches Arbeiten
: Nützliche Anleitungen:
Online Schaltungs simulator
https://www.circuitlab.com
Richtig_Loeten
siehe auch Grafik in
PraktikTips.html
(Eagle Zeichnung Löten )
Bohrer Durchmesser
Durch-Kontaktierung.html
FlachKabelStecker.html
Schrumpfschlauch.html
Abreitschritte, wie mit Schrumpfschläuchen eine Lötung stabilisiert wird. Oder zwei Stecker sauber zusammengehalten werden.
Verdrahtung.html
Techniken der Verdrahtung
ASURO
http://www.henkessoft.de/Roboter/ASURO.htm
PID Regelkreis:
(Abbildung aus http://www.hyperkommunikation.ch/lexikon/lexikon_index.htm)
http://www.roboternetz.de/phpBB2/zeigebeitrag.php?t=11818&highlight=pid
PID Fahrregler etc
unsigned char speed;
int speedLeft,speedRight;
unsigned int lineData[2];
int x, xalt, don, doff, kp, kd, ki, yp, yd, yi, drest, y, y2, isum;
void FollowLine (void)
{
unsigned char leftDir = FWD, rightDir = FWD;
FrontLED(OFF);
LineData(lineData);
// Messung mit
LED
OFF
doff = (lineData[0] - lineData[1]);
// zur Kompensation des Umgebungslichts
FrontLED(ON);
LineData(lineData);
// Messung mit
LED
ON
don = (lineData[0] - lineData[1]);
x = don - doff;
// Regelabweichung
isum += x;
if (isum > 16000) isum =16000;
//Begrenzung um Überlauf zu vermeiden
if (isum < -16000) isum =-16000;
yi = isum/625 * ki;
//I-Anteil berechnen
yd = (x - xalt)*kd;
// D-Anteil berechnen und mit
yd += drest;
// nicht berücksichtigtem Rest addieren
if (yd > 255) drest = yd - 255;
// merke Rest
else if (yd < -255) drest = yd + 255;
else drest = 0;
if (isum > 15000) BackLED(OFF,ON);
// nur zur Diagnostik
else if (isum < -15000) BackLED(ON,OFF);
else BackLED(OFF,OFF);
yp = x*kp;
// P-Anteil berechnen
y = yp + yi + yd;
// Gesamtkorrektur
y2 = y/2;
// Aufteilung auf beide Motoren
xalt = x;
// x merken
speedLeft = speedRight = speed;
MotorDir(FWD,FWD);
if ( y > 0) {
// nach rechts
StatusLED(GREEN);
speedLeft = speed + y2;
// links beschleunigen
if (speedLeft > 255) {
speedLeft = 255;
// falls Begrenzung
y2 = speedLeft - speed;
// dann Rest rechts berücksichtigen
}
y = y - y2;
speedRight = speed - y;
// rechts abbremsen
if (speedRight < 0) {
speedRight = 0;
}
}
if ( y < 0) {
// nach links
StatusLED(RED);
speedRight = speed - y2;
// rechts beschleunigen
if (speedRight > 255) {
speedRight = 255;
// falls Begrenzung
y2 = speed - speedRight;
// dann Rest links berücksichtigen
}
y = y - y2;
speedLeft = speed + y;
// links abbremsen
if (speedLeft < 0) {
speedLeft = 0;
}
}
leftDir = rightDir = FWD;
if (speedLeft < 20) leftDir = BREAK;
// richtig bremsen
if (speedRight < 20) rightDir = BREAK;
MotorDir(leftDir,rightDir);
MotorSpeed(abs(speedLeft),abs(speedRight));
}
int main(void)
{
unsigned char sw;
Init();
MotorDir(FWD,FWD);
StatusLED(GREEN);
speed = 150;
kp = 3; ki = 10; kd = 70;
// Regler Parameter kd enthält bereits Division durch dt
sw = PollSwitch();
if (sw & 0x01)
{ki=20;}
if (sw & 0x02)
{speed = 200;}
if (sw & 0x04)
speed = 100;
if (sw & 0x08)
kd = 35;
if (sw & 0x10)
kd = 70;
if (sw & 0x20)
kd = 140;
FrontLED(ON);
LineData(lineData);
speedLeft = speedRight = speed;
while(1){
FollowLine();
}
return 0;