PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Fehler im Sketch für ATtiny?



achso
15.10.2016, 19:20
Hallo,
ich möchte einen simplen Roboter bauen. Ähnlich einem Knicklenker. Ein Motor treibt eine durchgehende Achse an. Ein Servo reagiert auf 2 Taster(Fühler) indem es einfach bis zu einem Punkt nach links oder rechts dreht. Nach 1,5 Sekunden wieder auf Mitte. Wenn ein Fühler tastet, soll er noch rückwärts fahren. Statt H-Brücke ein Relais.
Schaltplan:
http://up.picr.de/27132031hs.jpg

Für den Arduino habe ich diesen Sketch, welcher auch super funktioniert:



#include <Servo.h>

Servo myservo; // create servo object to control a servo

int potpin = 0; // Widerstand an A0 messen
int val; // Die variable vom analog pin
const int relaisPin = 13; // Arbeitender DigitalPin
void setup()
{
myservo.attach(9); // Servo auf DigitalPin 9
pinMode(13, OUTPUT);// ist der schaltende Ausgang
}

void loop()
{
int val = analogRead(potpin); // Variable von den Widerständen messen
val = map(val, 0, 1023, 30, 150); //Eingrenzung des Servowinkels



if (val <= 50)
{
myservo.write(30); // sets position to the scaled value
digitalWrite(relaisPin, HIGH);
delay(1500);
}
else

{
myservo.write(90);
digitalWrite(relaisPin, LOW);
}

if (val >= 130)
{
myservo.write(150); // sets position to the scaled value

digitalWrite(relaisPin, HIGH);
delay(1500);
}
else

{
myservo.write(90);
digitalWrite(relaisPin, LOW);
}
}





Wenn ich nun diesen Sketch auf den ATtiny spielen will, läuft nichts. Statt "servo h" habe ich servo8bit h.
Zusätzlich habe ich noch AVR insight installiert.



#include <Servo8Bit.h>
Servo8Bit myServo; //Servo program mit ATtiny45.
//Für ATtiny 85 VCC an8 -GND an 4
//Widerstandsbrücke an Pin 7
//Motorrelais an Pin 6
// Servo an Pin 5
int potPin = A1; // Widerstand an Pin 7 messen
int val; // Die variable vom analog pin
const int relaisPin = 1; // Arbeitender DigitalPin6
void setup()
{
myServo.attach(0); // Servo auf DigitalPin Pin 5
pinMode(relaisPin, OUTPUT);// ist der schaltende Ausgang
}

void loop()
{
int val = analogRead(potPin); // Variable von den Widerständen messen
val = map(val, 0, 1023, 30, 150); //Eingrenzung des Servowinkels



if (val <= 50)
{
myServo.write(30); // sets position to the scaled value
digitalWrite(relaisPin, HIGH);
delay(1500);
}
else

{
myServo.write(90);
digitalWrite(relaisPin, LOW);
}

if (val >= 130)
{
myServo.write(150); // sets position to the scaled value

digitalWrite(relaisPin, HIGH);
delay(1500);
}
else

{
myServo.write(90);
digitalWrite(relaisPin, LOW);
}
}




Ich weiß wirklich nicht wo der Fehler liegt.

Danke für eure Hilfe

shedepe
16.10.2016, 10:20
Hast du schon einfache Sachen wie LED blinken lassen, nur PWM testen usw. auf dem ATtiny mittels eines Arduino Sketchs ausprobiert. Dann kannst du unterscheiden ob es ein Problem deines Programms oder deiner Konfiguration (Also ob dein Arduino Sketch überhaupt darauf anläuft) ist.
Du könntest ansonsten hingehen und einfach direkt auf Basis der avr - libc den Code schreiben. Ist auch nicht arg viel komplizierter und man lernt noch dabei etwas über den Mikrocontroller.

BMS
16.10.2016, 10:42
Hallo,
im Schaltplan vermisse ich noch die üblichen Abblockkondensatoren. Der ATtiny sollte 100nF an seinen Anschlüssen bekommen.
Für Motor und Servo wäre es noch gut wenn man einen Elko an die Versorgung schaltet ( Kapazität: z.B. 100µF oder mehr ).
Sonst bricht die Versorgungsspannung bei Last ein und der ATtiny schaltet ab oder startet neu...
Den ATtiny kann man auch über Diode+Elko aus dem Akku versorgen, damit er auch bei kurzen Spannungseinbrüchen nicht ausschaltet.
Grüße, Bernhard

shedepe
16.10.2016, 13:22
Zum Thema Schaltplan. Ein unbeschalteter Reset Pin ist auch nicht gut. Der muss mit 10 kOhm auf VCC gelegt werden.

achso
16.10.2016, 19:13
Hallo shepede,
Led Blinken ging. Fader nicht. Also kein PWM. Danke für den Tipp.
Ich habe schon Verständnisprobleme mit dem Arduino Kochbuch(leider).
Aber ich lese mir das durch.
Danke für den Hinweis mit den 10K auf VCC. Habe ich natürlich nicht.
Hallo Bernhard,
danke, das ist ein guter Tipp. Eigentlich logisch.

Dankeschön

Achim

redround
16.10.2016, 19:24
Der Code ist auch etwas optimierungsbedürftig. Nehmen wir mal an, VAL hat einen Wert von 200. Dann spring er im ersten IF in den Else-Zweig und gibt eine Soll-Position von 90 vor .... nur um dann im zweiten IF in den True Zweig zu springen und dann wird 150 als Sollposition ausgegeben. Das kann man zwar so machen, hat aber nichts mit sauberer und aufgeräumter Programmierung zu tun. Besser wäre her eine Switch Funktion.

Auch auf Delay sollte man eigentlich verzichten, wo immer möglich.

achso
17.10.2016, 18:58
Hallo redround,
du hast recht. Aber wenn nicht mehr im Sketch gemacht werden soll?
Ich bin froh, dass ich das überhaupt hinbekam.
Am liebsten bau ich blödsinnige "Roboter".(Mechanik) Viel Spaß hatte ich immer mit Logikgattern. Aber da ich dummerweise bei einem mit dem Platz nicht hinkam, hoffte ich auf den ATtiny 85.
Aber dieses IC kriege ich nicht zum laufen.
Bin mir noch nicht mal sicher, ob der ATtiny jetzt wirklich mit 8MHz läuft, oder nur 1 MHz schnell ist und somit kein PWM kann.
Aber der Winter fängt ja erst noch an.
Programmieren ist eine meiner ultra dunklen Unmöglichkeitsseiten, leider.

Achim

redround
17.10.2016, 20:33
Im "Auslieferungszustand" läuft er zwar mit 8 MHz allerdings ist auch die CKDIV8 Fuse gesetzt, so dass der interne Pre-Scaler zuschlägt und ihn auf 1 MHz "bremst". Auszug aus dem Datenblatt:


The device is shipped with CKSEL = “0010”, SUT = “10”, and CKDIV8 programmed. The default clock source setting is therefore the Internal RC Oscillator running at 8 MHz with longest start-up time and an initial system clock prescaling of 8, resulting in 1.0 MHz system clock. This default setting ensures that all users can make their desired clock source setting using an In-System or High-voltage Programmer.



Vielleicht solltest Du Dich mit jemandem zusammen tun, der lieber programmiert - und das meine ich wirklich nicht böse. Zusammen macht es a) mehr Spaß und b) kann man sich spezialisieren.

Für PWM spielt das aber nur bedingt eine Rolle. Das geht mit 1 MHz genauso gut wie mit 8 MHz ... nur das Timing ist halt etwas anders.

shedepe
18.10.2016, 07:25
Ansonsten man lernt ja stetig dazu. Braucht zwar etwas Zeit bis etwas dann geht, aber geht ;) Ich hab auch Ewigkeiten mit ziemlich einfachen Dingen verbracht (Wie z.B. Fuses setzen).

achso
18.10.2016, 19:09
Danke für das Aufmuntern.
Der ATtiny steckt in einer Fassung, welche als Shield auf einem UNO steckt.
Jetzt habe ich ihn nochmals an den Rechner gehängt. Alle Einstellungen nochmal geprüft.(internal 8MHz) Plötzlich und unerwartet geht der Fader sketch jetzt richtig.

Hoffnung keimt auf!

Bei der Arduino Library "Servo.H" definiert man das Servo als : "Servo myservo"
dann wird das doch in der Blackbox umgesetzt, welche dann weiß: Es geht jetzt um ein Servo.

Wie ist es denn dann bei der "Servo8bit. H"
Welches ist das Bezugswort?
Servo8bit myservo ?
Das wäre doch logisch?
Man braucht das Schlüsselwort?
Ab dann müßte die Library doch die Befehle genauso annehmen wie die vom Arduino?

Das mit dem Zusammensetzen geht nicht. Auch ich habe mein "Ding" weg. Ich brauche viel Ruhe, welche ich beim rumpfriemeln im abgeschirmten Keller finde.

Der ATtiny fasziniert mich sehr. Leider fand ich keine Anleitung(Buch) darüber. Über die Logikgatter findet man jede Menge. Außerdem sind sie mit Logik zu begreifen. Der Zugang zum Arduino fehlt mir noch.
Heute hatte ich das Buch von Herrn Bartmann in der Hand. Der ATtiny wird in diesem Wälzer nur einmal mit Passbild erwähnt.
Im Arduino Kochbuch nicht einmal das.
Die einfachen Programme laufen mit den Arduino Befehlen.
Nur eben die Servosache noch nicht.
Also suche ich zwar nicht das Zauberwort:"BITTE" aber schon ein Passendes.

Achim

- - - Aktualisiert - - -

Ich habe was gefunden:



#include <SoftwareServo.h>

SoftwareServo servo;
void setup()
{
servo.attach(0);}

void loop() {
int pos;
for(pos = 30; pos < 150; pos += 1) {
servo.write(pos);
delay(50);
SoftwareServo::refresh();//this row....
}
for(pos = 150; pos>=1; pos-=1) {
servo.write(pos);
delay(50);
SoftwareServo::refresh();//This row....
}
}


Das Rechtecksignal ist schön steil. 1.07 bis 1,89 mSec.
Aber eine Periode dauert 52 mSec.
Das Servo läuft ein bisschen wie ein Trecker
Unter 2,6 Volt ist nicht mehr viel los.
Aber immerhin.
Nun versuche ich meinen Sketch umzusetzen. Natülich mit Pufferelko und 100nF.

Achim

shedepe
18.10.2016, 19:46
Also als erstes. Freut mich dass du das geschafft hast. Dann; Informationen zu einem Mikrocontroller findet man wie bei allen anderen Bauteilen im dazugehörigen Datenblatt (z.B. ATtiny85 http://www.atmel.com/Images/Atmel-2586-AVR-8-bit-Microcontroller-ATtiny25-ATtiny45-ATtiny85_Datasheet.pdf )
Dann zu deinem Servo8 Bit Problem. Schau dir doch das Headerfile an. Dann weißt du welche Funktionen und Datentypen es gibt. Wenn du das Headerfile nicht verstehst würde ich dir empfehlen erst mal etwas C bzw. für den Mikrocontroller https://www.mikrocontroller.net/articles/AVR-GCC-Tutorial zu lernen. Hilft ungemeint weiter.
Warum du zu Arduino auf dem ATtiny nicht so viel finden wirst. Die Arduino Umgebung ist eigentlich für die Arduino Boards gedacht. Da gibt es meines Wissens nach keine die auf dem ATtiny aufbauen. Prinzipiell ist sind die ganzen Arduino Hilfsbibliotheken nichts anderes als Wrapper für die verschiedenen Funktionen des Mikrocontrollers.

Hier ist außerdem die Github Seite zu deiner Servo8Bit Bibliothek (bzw. deren Beispiel) https://github.com/fri000/Servo8Bit/blob/master/example.cpp

achso
18.10.2016, 20:13
Danke,
das du dich damit so weit auseinandersetzt mir zu helfen.
Von Github habe ich die Servo8Bit.
Leider übersteigt das Ganze den mir zur Verfügung stehenden geistigen Rahmen(Lernvermögen).
Deshalb muß ich auf flachem Nivaue bleiben.
Ich versuche die for Schleife durch eine if Abfrage und Ausführung zu ersetzen.
Wenn ich hier passen muß, weiche ich auf Pro Mini aus.
Der Chip ist zwar größer, aber das Hochladen ist kein Problem.
Dann finde ich mich damit ab, nur Benutzer zu sein.

Also, danke für deine Zuarbeit.
Aber du kennst ja den Spruch: "Perlen vor die Säue".
Achim

shedepe
18.10.2016, 20:30
Nur nicht so schnell aufgeben. Nur wenn man rumprobiert lernt man dazu. Ich programmiere jetzt schon seit 5 Jahren C/C++ und hänge trotzdem an manchen Problemen noch mehrere Tage.

achso
19.10.2016, 06:53
Fünf Jahre?
Ja, ich liebe es auch Probleme zu lösen. Dummerweise hänge ich an dieser ATtiny Servo Steuerung, die ja nicht so intensiv aufregend ist, auch schon 4 Wochen fest. Dieses ganze Thema ist eher so ein Fass ohne Boden. Vom 100. zum 1000. Vor 4 Monaten habe ich unseren Eingangsbereich unterm Carport modernisiert. Eine 2,5 Meter breite Pforte aus Eisen geschweißt und verzinken lassen. Selbige motorisch als Rolltor angetrieben. Mit Videoüberwachung der Autos und Tüddelüt aller Art. Dazu einen Arduino Nano als Klingelschild scrollend mit unserem Namen und dem Hinweis, dass man zum Klingeln an der Kette, welche im Sichtbereich hängt, ziehen soll, woraufhin der Addam´s Sound: "Sie haben geläutet" kommt. Natürlich in angemessener Brillianz und Lautstärke. Drinnen merken wir das dann auch. Alles funktioniert prima. Allein das Display zeigt seid Gestern nur noch Krickel.
Dafür lohnt sich doch der Aufwand nicht? Die anderen Elektroniken sind noch altmodisch aufgebaut und laufen. Natürlich ist alles versiegelt. Zu kalt kann es dem Microcontroller auch nicht geworden sein, da im selben Gehäuse ein Tastenschloß mit Transponder Abfrage sitzt, welches etwas Verlustwärme abgibt.
Soviel zu meiner Überzeugung was dieses Zeitgrab angeht.
Trotzdem versuche ich heute Abend aus der for-Schleife eine gemapte If Abfrage zu machen.
Danke für das Anspornen.
Achim

shedepe
19.10.2016, 07:19
Das mit der Temperatur könntest du auch aus dem Datenblatt sehen ;) Die Controller sind in der Regel nicht empfindlich, die Displays wiederum schon. Das sind ja in der Regel welche die auf Flüssigkristallbasis arbeiten und die mögen weder zu viel Kälte noch zu viel Hitze.

redround
19.10.2016, 11:42
Wie meine Vorredner (-schreiber) schon sagten: die Arduino-Bibliotheken sind speziell auf einige Prozessoren angepasst. Solange man also zum Beispiel einen ATMega328 nutzt, ist alles gut. Sobald man einen etwas exotischeren Controller nutzt, funktionieren viele der Standard-Bibliotheken nicht mehr. Digistump (http://digistump.com/) hat ein Arduino-Board auf Basis eines ATtiny. Dafür gibt es auch eine Erweiterung der Arduino-IDE mit ein paar passenden Bibliotheken.

Für meine eigenen Projekte bin ich allerdings von der Arduino Software wieder abgerückt, da sie doch recht unflexibel ist und jede Menge Overhead mitbringt. Es ist zwar etwas mehr Arbeit, einen Controller in nativem C zu programmieren, allerdings lohnt sich der Aufwand in meinen Augen. Ich nutze deshalb eigentlich nur noch das ATMEL Studio. Habe dort auch schon einige Projekte mit Servos umgesetzt, ohne auf fertige Bibliotheken zurück zu greifen. Übrigens auf Basis eines ATtiny45, der dafür dicke reicht, wenn man auf den ganzen Arduino Schnick-Schnack verzichtet. Eines der Projekte ist ein Servo-Positionier-Modul, bei dem man die beiden Servo-Positionen per Poti einstellen kann und dann einfach per Taster oder per Optokoppler-Eingang hin und herschalten kann. Vielleicht kannst Du Dir Dein Leben etwas erleichtern, wenn Du aus sowas zurück greifst.

Wenn man die Grundlagen und die Theorie der Servo-Ansteuerung mal verstanden hat (und zudem vielleicht noch ein Oszi hat), ist das eigentlich alles kein Problem und geht insgesamt vielleicht sogar schneller als der Versuch, Arduino auf Deine Bedürfnisse anzupassen.

achso
19.10.2016, 18:33
Kalt oder heiß, wer weiß?
Das baue ich nicht wieder.
Vielleicht noch als Raumthermostat im Haus.

Ich glaube ich vertüddel mich gerade total.
Je mehr man liest, je mehr Info. Leider breit gefächert.

An Schnick-Schnack habe ich auch kein Interesse.

Genau das suche ich gerade:
Eines der Projekte ist ein Servo-Positionier-Modul, bei dem man die beiden Servo-Positionen per Poti einstellen kann und dann einfach per Taster oder per Optokoppler-Eingang hin und herschalten kann.
Meinst du bei Digistump die kleinen Wifi Boards?
Ich habe noch mehrere von den ATtinys und ProMinis.
Damit muß ich erstmal etwas machen. Es reicht schon, dass ich unter anderem jede Menge Logik Ic wenig Sinnvoll rumliegen habe.
Ich versuche mal einen Servo-Positionier-Modul-Sketch hinzukriegen.

redround
19.10.2016, 18:46
Ich dachte eher an was fertiges: http://shop.cboden.de/Schaltgeraete/Servo-Positionier-Modul-mit-Optokoppler-Eingaengen.html?listtype=search&searchparam=servo

Du kannst das aber natürlich auch selbst bauen. Wenn Du willst, kann ich aber auch eine komplette Steuerung für Dich bauen. Vielleicht kannst Du Dich ja mal mit etwas Mechanik revanchieren

achso
19.10.2016, 20:49
Das sieht ja sehr gut aus.
Aber leider auch sehr groß. Dann ist ja der ProMini wieder im Spiel. Auch weil ich gerne mit 3,7 Volt bastle.




#include <SoftwareServo.h>




SoftwareServo myservo; // create servo object to control a servo

int potpin = A1; // analog pin used to connect the potentiometer
int val; // variable to read the value from the analog pin
const int relaisPin = PB1; // Arbeitender DigitalPin6

void setup()
{
myservo.attach(0); // attaches the servo on pin 2 to the servo object
pinMode(PB1, OUTPUT);// ist der schaltende Ausgang

}

void loop()
{
val = analogRead(potpin); // reads the value of the potentiometer (value between 0 and 1023)
val = map(val, 0, 1023, 0, 179); // scale it to use it with the servo (value between 0 and 180)
myservo.write(val);
// waits for the servo to get there

SoftwareServo::refresh();
int val = analogRead(potpin);
if (val <= 70)
{
digitalWrite(relaisPin, HIGH);
}
else
{
digitalWrite(relaisPin, LOW);
}
if (val >= 110)
{
digitalWrite(relaisPin, HIGH);
}
else
{
digitalWrite(relaisPin, LOW);
}

}

Sorry die //Beschreibung stimmt nicht.
Das Funktioniert schon. Mir fehlt die Info wie man 2 Werte in die if Abfrage setzt.
so wie ich das jetzt habe geht es nicht.



if (val <= 70 >=120)

So auch nicht. Also zwischen 2 Werten HIGH sonst LOW?
Wie schreibt man das?
Steht irgendwie nicht im Arduino Kochbuch?
Das das Servo nur solange reagiert, wie ein Taster gedrückt ist, regle ich einfach Analog.
Jegliches delay mag die Library nicht.

Leider bin ich jetzt bis Dienstag weg. Meine Frau verschleppt mich ganz hoch rauf, bis zur Mosel. Gefährliches Erdbebengebiet.
Naja, ich muß mit.
Meint sie?
Dabei habe ich hier soviel zu tun!
Beton vor der Pforte schütten, Blätter harken, Katzen füttern, einkaufen, Haus putzen, 10 Tage warten bis das Kind vom Reiterhof kommt,
Dachrinne sauber machen, Gartenteich ausräumen und und und diesen Blödsinn hier machen.
Sie meint das nützt nichts!
Tschüss
oder heißt es jetzt schon
Tschüssle?
Achim

Sisor
19.10.2016, 22:23
Mir fehlt die Info wie man 2 Werte in die if Abfrage setzt.
So auch nicht. Also zwischen 2 Werten HIGH sonst LOW?


digitalWrite(relaisPin, (val > 70 && val < 120) ? HIGH:LOW);

In den inneren Klammern steht eine und (&&) verküpfte Bedingung.
Nach der Bedingung steht was zu tun ist nach folgender Syntax:
Bedingung ? True-Fall : False-Fall

Genauso geht:

boolean is_in_bounds = val > 70 && val < 120;
digitalWrite(relaisPin, is_in_bounds);

// oder
if(digitalWrite(val > 70 && val < 120)
digitalWrite(relaisPin, HIGH);
else
digitalWrite(relaisPin, LOW);

achso
03.11.2016, 17:12
Die Ferien sind längst vorbei und ich versuche es weiter.
Danke Sisor, für deine Wissensvermittlung. Das hat mir sehr geholfen!
Der Sketch lief zwar, aber auch wenn nichts gemacht werden sollte flossen 30-40mA.
Kann sein, das es an der geringen Spannung und den billigen Servos liegt. Eben, das sie die Position nicht eindeutig finden und weiter versuchen.
Jetzt habe ich nach etlichen Versuchen einen sketch gefunden, welcher selbst bei 2,6 Volt läuft.
Hier wird das/der Servo(Wie überhaupt-der-die-das) in Schritten mit Pause geführt.
Mein Problem ist aber, das hier eine ständige Wiederholfunktion im Vordergrund steht. Eine-for- Schleife.
Ich habe viel Versucht, aber die Softwareservo Bibliothek nimmt nichts an. Mit anderen Worten. Es passiert nichts.
Begeister bin ich von der ATtiny Stabilität. Weit über 100 x habe ich ihn schon aus der Fassung gezogen und in das Steckbrett gesetzt.

Also würde ich gerne wissen, wie ich die for Schleife ersetze, sodass nur nach Aufforderung das Ziel in einzelnen Schritten erreicht wird. Wie immer hilft mir das Arduino Kochbuch nicht weiter. Da werden rotierende Servos beschriebe. Auch mit ner "for" Schleife. Statt nur den Grundcode zu geben sind in allen Beispielen immer 2 Funktionen verknüpft.
Damit habe ich Probleme

Achim, der Versuchende.


#include <SoftwareServo.h>

SoftwareServo servo;
void setup()
{
servo.attach(0);} //benennt den Pin des Servos

void loop()
{
int pos; //wechselnde Position, nach numerischen Werten???
for(pos = 30; pos < 150; pos += 1)//Bestimmung,soll in 1ner Schritten von 150 nach 30° laufen
{
servo.write(pos); // //Nun soll das Servo laufen
delay(20);
SoftwareServo::refresh();//this row....

}
{ delay(2000);
}


{
delay(2000);
}

for(pos = 150; pos>=30; pos-=1) //das Gleiche rückwärts
{
servo.write(pos);
delay(20);
SoftwareServo::refresh();//This row....

}
{
delay(2000);
}
}

achso
04.11.2016, 06:48
Wenn ich in dem unteren Sketch nur


servo.write(pos=150);
delay(50);
{
delay(1000);
}
servo.write(pos=30);
delay(5o);
{
delay(1000),
}


eingebe, versucht es wenigstens etwas dem Befehl zu folgen.

Wenn ich


#include <SoftwareServo.h>

SoftwareServo servo;

void setup()
{
servo.attach(0);

}

void loop()
{
int pos;


{servo.write(pos=30);// //Nun soll das Servo laufen
delay(5);
servo.write(pos=30);// //Nun soll das Servo laufen
delay(5);
servo.write(pos=32);// //Nun soll das Servo laufen
delay(5);
servo.write(pos=34);// //Nun soll das Servo laufen
delay(5);
servo.write(pos=36);// //Nun soll das Servo laufen
delay(5);
servo.write(pos=38);// //Nun soll das Servo laufen
delay(5);
servo.write(pos=40);// //Nun soll das Servo laufen
SoftwareServo::refresh();
delay(5);
servo.write(pos=42);// //Nun soll das Servo laufen
delay(5);
servo.write(pos=44);// //Nun soll das Servo laufen
delay(5);
servo.write(pos=46);// //Nun soll das Servo laufen
delay(5);
servo.write(pos=48);// //Nun soll das Servo laufen
delay(5);
servo.write(pos=50);// //Nun soll das Servo laufen
SoftwareServo::refresh();
delay(5);
servo.write(pos=52);// //Nun soll das Servo laufen
delay(5);
servo.write(pos=54);// //Nun soll das Servo laufen
delay(5);
servo.write(pos=56);// //Nun soll das Servo laufen
delay(5);
servo.write(pos=58);// //Nun soll das Servo laufen
delay(5);
servo.write(pos=60);// //Nun soll das Servo laufen
delay(5);

SoftwareServo::refresh();
servo.write(pos=62);// //Nun soll das Servo laufen
delay(5);
servo.write(pos=64);// //Nun soll das Servo laufen
delay(5);
servo.write(pos=66);// //Nun soll das Servo laufen
delay(5);
servo.write(pos=68);// //Nun soll das Servo laufen
delay(5);
servo.write(pos=70);// //Nun soll das Servo laufen
delay(5);
servo.write(pos=72);// //Nun soll das Servo laufen
SoftwareServo::refresh();
delay(5);
servo.write(pos=74);// //Nun soll das Servo laufen
delay(5);
servo.write(pos=76);// //Nun soll das Servo laufen
delay(5);
servo.write(pos=78);// //Nun soll das Servo laufen
delay(5);
servo.write(pos=80);// //Nun soll das Servo laufen
delay(5);
servo.write(pos=82);// //Nun soll das Servo laufen
SoftwareServo::refresh();
delay(5);
servo.write(pos=84);// //Nun soll das Servo laufen
delay(5);
servo.write(pos=86);// //Nun soll das Servo laufen
delay(5);
servo.write(pos=88);// //Nun soll das Servo laufen
delay(5);
servo.write(pos=90);// //Nun soll das Servo laufen
delay(5);
servo.write(pos=92);// //Nun soll das Servo laufen
delay(5);

SoftwareServo::refresh();
}
{delay(1000);
}

{
servo.write(pos=90);// //Nun soll das Servo laufen
delay(5);
servo.write(pos=88);// //Nun soll das Servo laufen
delay(5);
servo.write(pos=86);// //Nun soll das Servo laufen
delay(5);
servo.write(pos=84);// //Nun soll das Servo laufen
delay(5);
servo.write(pos=82);// //Nun soll das Servo laufen
delay(5);
servo.write(pos=80);// //Nun soll das Servo laufen
delay(5);
servo.write(pos=78);// //Nun soll das Servo laufen
delay(5);
servo.write(pos=76);// //Nun soll das Servo laufen
delay(5);
servo.write(pos=74);// //Nun soll das Servo laufen
delay(5);
SoftwareServo::refresh();

servo.write(pos=72);// //Nun soll das Servo laufen
delay(5);
servo.write(pos=70);// //Nun soll das Servo laufen
delay(5);
servo.write(pos=68);// //Nun soll das Servo laufen
delay(5);
servo.write(pos=66);// //Nun soll das Servo laufen
delay(5);
servo.write(pos=64);// //Nun soll das Servo laufen
delay(5);
servo.write(pos=62);// //Nun soll das Servo laufen
delay(5);
servo.write(pos=60);// //Nun soll das Servo laufen
delay(5);
servo.write(pos=58);// //Nun soll das Servo laufen
delay(5);
servo.write(pos=56);// //Nun soll das Servo laufen
delay(5);
SoftwareServo::refresh();
servo.write(pos=54);// //Nun soll das Servo laufen
delay(5);
servo.write(pos=52);// //Nun soll das Servo laufen
delay(5);
servo.write(pos=50);// //Nun soll das Servo laufen
delay(5);
servo.write(pos=48);// //Nun soll das Servo laufen
delay(5);
servo.write(pos=46);// //Nun soll das Servo laufen
delay(5);
servo.write(pos=44);// //Nun soll das Servo laufen
delay(5);
servo.write(pos=42);// //Nun soll das Servo laufen
delay(5);
servo.write(pos=40);// //Nun soll das Servo laufen
delay(5);
servo.write(pos=38);// //Nun soll das Servo laufen
delay(5);
SoftwareServo::refresh();
servo.write(pos=36);// //Nun soll das Servo laufen
delay(5);
servo.write(pos=34);// //Nun soll das Servo laufen
delay(5);
servo.write(pos=32);// //Nun soll das Servo laufen
delay(5);
servo.write(pos=30);// //Nun soll das Servo laufen
delay(5);
servo.write(pos=28);// //Nun soll das Servo laufen

SoftwareServo::refresh();
}
{
delay(1000);
}
}


eingebe, geht nichts??

Sisor
04.11.2016, 10:11
Hi achso.
Lies dir mal hier (http://playground.arduino.cc/ComponentLib/Servo)die Beschreibung von refresh() durch und warte bis es 'KLICK' macht:).

achso
04.11.2016, 12:02
Hi Sisor,
da habe ich die Library auch her und das gelesen.


refresh()
You must call this at least once every 50ms to keep the servos updated. You can call it as often as you like,
it won't fire more than once every 20ms. When it does fire, it will take from .5 to 2.5 milliseconds to complete,
but won't disable interrupts.


Soweit ich das verstehe, verstehe ich nicht viel. Für mich steht da, dass alle 50ms die Servos upgedatet werden sollen. Was aber das Programm nicht unterbricht. Das es nicht mehr als alle 20ms feuert verstehe ich nicht. Wenn es aber feuert, ist es nach 2,5ms fertig?
Gerne hätte ich den "Klick". Blöderweise aber nur ein Heulen und Pfeifen.
Heute Abend probiere ich weiter rum. Mit Lernen ist nicht viel drin. Ich habe "mein Ding vor einigen Jahren weggekriegt". Eben Pech gehabt. Nun muss es so gehen. Ich muss immer alles gleichzeitig sehen, dann kann ich kombinieren. Bei der Programmierung muß man sich viel Neues merken, das leistet mein Gehirn nicht mehr.
Schönen Dank
Achim

Sisor
04.11.2016, 13:34
Ok. Die Routine refresh() muss mindestens einmal alle 50ms aufgerufen werden. Deine Programme haben in der loop delay()-Aufrufe, die mehr Zeit verstreichen lassen.

Edit: Habe mir den Quelltext der Bibliothek angeschaut: Da steht nichts von maximal 50ms. Komisch... Ich war mir sicher, das wäre die Bibliothek, wo nach 50ms nichts mehr geht. Hab's verwechselt.

achso
04.11.2016, 19:31
Danke,
ich hatte die Delays zusammengezählt und dachte das es reicht. Weiter unten vergaß ich allerdings den refresh einzufügen.

Nun habe ich experimentiert.



servo.write(pos=34);// //Nun soll das Servo laufen
delay(15);
SoftwareServo::refresh();



und nach jedem Positionswertwechsel ein refresch eingesetzt.
Die 5 mS reichten nicht aus. Das Servo fand die Position nicht.
Deshalb ging ich mit der Pause hoch.
Bei 20 mS ist nichts mehr los. Das Oszilloskop hat nur noch eine krickelige 100mV Spannung angezeigt??
Die Position des Servos hängt extrem von der Spannung ab.
Bei 4 Volt kommt es mit 60° noch hin. Bei 3Volt sind es noch 30°.
Darunter ist dann Schluß.
Ärgerlich, denn der Sweep Sketch geht ohne Probleme bis 2,6 Volt.


for(pos = 30; pos < 150; pos += 1)//Bestimmung,soll in 1ner Schritten von 150 nach 30° laufen


Bei verwendung dieser Zeile geht es.

Also ich möchte dass das Servo, wenn nichts ist, auf 90° steht.

Ist der eine Taster gedrückt soll das Servo auf 55° laufen.

Ist der andere Taster gedrückt soll das Servo auf 125° laufen.

Nach einer Pause soll es dann wieder auf 90° laufen.

Der Sketch für den ProMini läuft gut und wird auch verwendet.


Die Story:

Meine Tochter ist 15 und geht auf eine Gesamtschule.
Über den Technik Untericht habe ich mich schon immer geärgert, da kein Material und nur abgearbeitetes Schrott Werkzeug vorhanden ist.
Vor 2 Jahren hatten Sie das Thema "Elektrizität".
Da sprach ich schon den Lehrer, welcher auch der Rektor ist an, ob er nicht mal mehr Spaß in seinen Untericht bringen möchte. Vielleicht kleine Spaßroboter bauen. Daraufhin entwickelte ich mehrere kleine Lichtfolger (Ja Logiktechnik kann ich). Keiner kostete nicht mehr als 7€. Meine Tochter baute jeden von ihnen in 1 1/2 Stunden zusammen. Wir hatten vordem aber auch schon viele andere mit aufwendiger Analog Technik zusammengebaut.
Ich hatte jeden Schritt aufgeführt und fotografiert. Aber der Lehrer hatte dann dafür keine Zeit.
Jetzt 2 Jahre danach unterichtet er Elektronik im Fach Technik.
Meine Tochter sagte: "Wir haben heute die 2. Doppelstunde damit zugebracht 4x 2cm lange Kupferdrähte zu Quadraten zusammen zu Löten. Mit 60 Watt Lötkolben welche sonst benutzt werden, um in Holz Buchstaben zu brennen."
"Tu was."
Das tat ich dann.
Simpel mussten sie sein und einfach nachvollziehbar. Den ProMini fertig programmiert mit angelöteten Litzen. Eben als Blackbox. Auch das Relais mit Litze verlötet, da SMD.
Dafür die anderen Bauteile und das Zusammenspiel erklärt.
15 Tragplatten mit der Oberfräse ausgefräst und 15 x das Material zusammengestellt.
In der Zwischenzeit waren Ferien. Meine Tochter hatte danach die Lichtfolger von damals mit zum Untericht genommen und vorgeführt. Der Lehrer war erstaunt und konnte sich nicht daran erinnern, dass wir ihm seinerzeit Muster und eine Taschenlampe + Anleitungsdoku auf CD überliessen.
Natürlich hatte sie jetzt auch noch einen Kasten mit Lötstation, Multimeter, 3. Hand, Regelbares Netzteil, Werkzeug usw mitbekommen.
Das geht jetzt seinen Gang und wie ich meine Tochter einschätze, spielt das Monster jetzt den Lehrer an die Wand. Jedenfalls ist sein Untericht jetzt gestört.

Deshalb also mein unermütliches Nerven. 15 ATtiny sind preiswerter als 15 ProMini . Aber es sind ja auch noch 15 Motoren,15 Relais und 15 Servos im Spiel.
Nur Analog mit H-Brücke, das wäre zu viel für die Handcomputerträger gewesen. Dann lieber Blackbox.

http://up.picr.de/27337676ix.jpg

Das ist ein Antriebsset.
Die Elektronikset`s sind alle in der Schule.

Trotzdem möchte ich gerne die gleiche Funktion mit dem ATtiny verwirklichen. Für ein "Privates" Projekt.

Sisor
04.11.2016, 20:57
Hey, du hast eine falsche Vorstellung davon wie ein Servo bzgl. des Winkels arbeitet. Der Winkel ist nicht vom Pegel der Spannung sondern der Dauer des Pulses abhängig. Ich empfehle dazu den Servo-Artikel auf RN-Wissen.de (http://rn-wissen.de/wiki/index.php?title=Servos) zu lesen.
Oder habe ich dich falsch verstanden?

achso
04.11.2016, 21:07
Doch, ich weiss wie ein Servo arbeitet. Wenn ich die Spannung reduziere, läßt das Servo Schritte aus, oder der ATtiny. Ich habe schon ne Menge Servos mit 555 und 4001 Ic`s gesteuert.
Aber die Sache mit dem ATtiny hat sich gerade erledigt. Ich Hirsch habe gerade eben gelesen, das "if" und "else" nicht funktionieren.

Schade,
Aber dankeschön!

Achim

Sisor
04.11.2016, 21:25
Ich Hirsch habe gerade eben gelesen, das "if" und "else" nicht funktionieren.
Wo hast du das her?

oberallgeier
05.11.2016, 09:00
.. Doppelstunde damit zugebracht 4x 2cm lange Kupferdrähte zu Quadraten zusammen zu Löten. Mit 60 Watt Lötkolben ..Oh Mann, ich kenne solche Sorgen. Egal ob meine Tochter die erste war, wirklich auch wurde, die zur Schiwoche NUR mit Snowboard kommt und ich den unabdingbar-zertifizierten Boardtrainer organisieren musste (Alpenregion, viele Schilifte in der Umgebung! - kein Sportlehrer hatte den Snowboardschein oder konnte den machen, mit 14 Monaten Vorwarnung!) oder ob es um Mikrocontrolleranwendung auf nem Naturwissenschaftlich-technischen Gymnasium ging, es ging nur mit Elternhilfe und -initiative. UND ! ! der zuständige Lehrer musste (m)ein Freund sein. Aber dann gings los mit der (meiner) ersten Mikrocontroller-AG, danach mit nem Jugendforschtprojekt auf Controllerbasis und mit sehr guten Erfolg. Ich bin fest überzeugt dass es keinen Sinn macht, den Lehrer umzubiegen.

Du bist auf dem richtigen Weg wenn Du die Sache so vorbereitest. Vielleicht auch als AG anbieten (ausserschulisches Projekt?) .

achso
05.11.2016, 12:49
Hallo Sisor,
Arduino Playground oder hier:

https://www.frag-duino.de/index.php/maker-faq/37-atmel-attiny-85-mit-arduino-arduinoisp-flashen-und-programmieren


Für eure eigenen Projekte stehen euch nur die folgenden Befehle zur Verfügung:

pinMode()
digitalWrite()
digitalRead()
analogRead() (Nur PIN 2,3 und 4)
analogWrite() (Nur PIN 0 und 1)
shiftOut()
pulseIn()
millis()
micros()
delay()
delayMicroseconds()
SoftwareSerial

Das steht leider überall. Ich habe nicht drauf geachtet, da ich davon ausging ohnehin nur die simpelsten Forderungen zu stellen.

Hallo oberallgeier,
das kann ich nachvollziehen. An unserer Schule ist Elternarbeit unerwünscht. Die wenigen Lehrkräfte die Wissen und Spaß an den Kids haben, gehen unter. Ich hatte unter anderem Beruflich eine Schulung über Waschmaschinen erarbeitet. Eine aufgeschnittene Waschmaschine mit allen Funktionen und alle Bauteile extra zum anfassen. Mit Information über Waschchemie, Abläufe usw aufgeheitert durch Clips wie z.B. Clementine, welche Fragen aufwarfen, auch über Werbungsversprechen und das Wecken von Begehrlichkeiten . Das stellte ich kindgerecht um. Aktiv konnten die Schüler und die Lehrkraft, welche mir gütigerweise eine Stunde zur Verfügung gestellt hatte, nacheinander erleben, wie sich Unwuchten auswirken, Permanentmotoren (Pumpe) arbeiten wenn man einen Schraubenzieher reinsteckt usw. Als die Stunde um war, bat mich die Lehrkraft am nächsten Tag noch eine Doppelstundezu geben. Über meine Tochter,es war ihre Klasse, erfuhr ich das die Klasse noch nie so still war und alle Spaß hatten. Dann schaffte ich alle Teile in den Flur.
Es war ja gerade Pause und viele Lehrkräfte schlenderten daran vorbei um in den Raucherbereich zu gelangen.Auch der Rektor.
Ich bewahrte alles noch geraume Zeit auf, es kam keine weitere Nachfrage.
Danach hatte ich noch mal Messingplatten, Kupferreste vom Schrott gekauft, einen Trecker Anhänger voller Holzreste vor dem Werkraum abgekippt. Alles auf Grund dessen, das meine Tochter z.B. feststellte das kein Holz da war, um Nistkästen zu bauen.
Es kam kein Feedback.
Bin gespannt, was der Rektor jetzt anstellt. Ob er gegen den Willen mindestens einiger Kinder das Projekt einstellt oder zulässt.
Traurig, aber wahr.

Achim

Sisor
05.11.2016, 19:47
Hallo Sisor,
Arduino Playground oder hier:

https://www.frag-duino.de/index.php/...-programmieren


Für eure eigenen Projekte stehen euch nur die folgenden Befehle zur Verfügung:

pinMode()
digitalWrite()
digitalRead()
analogRead() (Nur PIN 2,3 und 4)
analogWrite() (Nur PIN 0 und 1)
shiftOut()
pulseIn()
millis()
micros()
delay()
delayMicroseconds()
SoftwareSerial

Das steht leider überall. Ich habe nicht drauf geachtet, da ich davon ausging ohnehin nur die simpelsten Forderungen zu stellen.
Glaub nicht alles was im Internet steht! Die Aussage 'Für eure eigenen Projekte stehen euch nur die folgenden Befehle zur Verfügung' ist so falsch.
Erstens handelt es ich nicht um Befehle, sondern um Funktionen bzw. Objekte (Softwareserial).
Zweitens sind das nicht alle.
Und drittens gilt ein großer Teil der C++ Befehle und Sprachkonstrukte, wie z.B. Objekte.

Deine Annahme, es gäbe im ATiny-Umfeld kein 'if', ist falsch. Im Zusammenhang des Textes meinte der Autor wohl, es stehen nicht alle 'normalen' Arduino-Funktionen zur Verfügung, sondern nur ein von ihm aufgezeigter Teil.

achso
05.11.2016, 20:18
If und else gehen doch. Was schreiben die denn da.
Schade ,ich dachte ich bin den Nerv los. Aber nun muss ich ja weiter machen!




const int halPin= A1;// Analog Hallsensor SS39ET

const int ledPin = 0;//Schaltender Ausgang
int threshold = 540; // Schwellwert -Ausprobiert


void setup() {
pinMode(0,OUTPUT);


}

void loop() {
int val ;
int Volt;//Irgendwie muß das ja heißen

val = analogRead(halPin);//Hallsensor einlesen
Volt = map(val, 0, 1023, 0, 1023);//Keine Einschränkung


if (Volt > threshold)//Wenn über Schwellwert
{
digitalWrite(ledPin, LOW);
delay(5000);
}
else
{
digitalWrite(ledPin, HIGH);
}
}




Funktioniert einwandfrei. Dachte mir, da meine Frau auf ihrer Faller Landschaft Autos fahren lassen will, wäre es sinnvoll, wenn der Hintere nicht auf den Vorderen auffährt. Mit Ir Dioden ist das nicht machbar. Fremdlicht ist das kleinste Problem. In den Kurven klapt es nicht. Wenn jetzt der Hintere bis auf 13mm auffährt, bleibt er stehen für x Time. Vielleicht noch Warnblinker. Wenn er wieder losfährt ist der vordere längst weg. auch bei diesem Problem fällt mir nichts besseres Simples ein?.
Analoge Hall-Sensoren sind auch kaum zu bekommen.

- - - Aktualisiert - - -

Hallo Sisor,
da waren wir zeitgleich am Button "ANTWORTEN".
Danke für deine Recherche.

Achim

oberallgeier
06.11.2016, 08:44
.. Wenn er wieder losfährt ist der vordere längst weg. auch bei diesem Problem fällt mir nichts besseres Simples ein? ..Hallo Achim, vor vielen Jahren wurde diese schöne Breitband"Stoßstange" von Sigo aufgebaut (klick) (https://www.roboternetz.de/community/threads/31179-Schnelle-180%C2%B0-IR-Sto%C3%9Fstange-mit-Winkel-und-grober-Entfernung?highlight=TSOP7000). Vielleicht ist das was für Dich, zumindest als Anregung. Sollte auch als Kleinstausführung mit SMD-Aufbau funktionieren. Oder wirklich nur zwei, drei Sendedioden nehmen und ein Aufbau ähnlich wie bei meinem MiniD0-Deckel (https://www.roboternetz.de/community/threads/36121-Autonom-in-kleinen-Dosen-R2_D03-Nachfolger-R3D01?p=478095&viewfull=1#post478095) (die goldenen Schüsselchen sind die gepulsten/gechirpten IR-Dioden in SMD, die drei schwarzen Klötze sind die IR-Empfänger). Damit sind die paar cm sicher erkennbar.

achso
06.11.2016, 19:02
Hey Oberallgeier,
das ist ja scharf.
2011 hatte ich das hier gebaut.(Oh ist das staubig! Ich Ferkel)

http://up.picr.de/27362281xz.jpg

http://up.picr.de/27362282uh.jpg

Zuerst für 2 Mignonzellen.
Dann kamen die Lipo Akkus ins Spiel.
Aber die Steuerung war zu groß.
Mit dem Pro Mini oder ATtiny wird es gehen.
Über den Reibradantrieb soll er auf dem hellen Tisch fahren.
beim Hindernis oder Tischkante, soll er etwas Rückwärts fahren, dann das Servo entsprechend eine Seite anheben. Dadurch fährt er zwangsläufig eine Kurve.Dann wieder vorwärts.
Naja, bei meinem Problem etwas zu Programmieren wirds wohl noch dauern. Nicht Eure Klasse, aber auch was.
Den Tread lese ich mir gleich mal ganz durch.
Die 1:87 Autos sind sehr sehr klein. Man packt alles um den Akku, Motor, Lenkung rum. Aber das OpenDCC Projekt ist für den Quatsch da wenige Autos ohne Sinn durch die Gegend rollen zu lassen zu aufwendig, teuer.
Der einzige bei Reichelt verfügbare SMD Linear Hall-Sensor ist zum Glück kaum von der Magnetgröße und dem Spannungsbereich von 3,3Volt - 4,2 Volt in seiner Funktion abhängig. Damit meine ich, das er immer eine gleiche leichte Spannungsänderung vollzieht, wenn der Magnet auf 10mm rankommt. Vielleicht schaffe ich es ja den ATtiny so zu programmieren, dass dann der Motor über PWM eine Zeit gedrosselt wird, oder wenn die Spannung stärker verändert wird, für eine Zeit ganz stoppt.

achso
08.11.2016, 19:13
Hallo,

mit dem simple "CARSYSTEM" bin ich etwas weitergekommen.

Es funktioniert so schon ausreichend. Ich gebe die Geschwindigkeit des Autos (1:87) mit der PWM vor.

Der Motor ist ja sehr klein. So wie diese Rüttelmotoren aus den Handys. Zur Entstörung habe ich 2x 1nF von den Kontakten zum Gehäuse und 100nF parallel zum Motor gelegt. Das reichte aber noch nicht. Mit 1µF paralolel geht es so lala. Sonst bootet der ATtiny ständig neu. Man sieht das auch ganz gut am Oszi.
Wenn noch Platz ist, kann ich auch einen Elko nehmen.

Wie binde ich jetzt den 2. threshold ein.
Wenn der 1. threshold erreicht wird, bleibt das Auto für eine Zeit mit Warnblinker stehen, und fährt dann wieder los.
Dieses entspräche dem, dass das vorfahrende Auto anhält.
Wenn das vorfahrende Auto nur zu langsam ist, soll das hintere Auto nur eine Zeitlang langsamer fahren.
Bei einer 2. if Abfrage fällt mir kein else ein. Aber das ist wohl der total falsche Weg.




const int halPin = A1; // Analog Hallsensor SS39ET
#define speedM 0 //erklärung das PWM an 0

int threshold_1 = 570; // 560Schwellwert -Ausprobiert
int threshold_2 = 700; // Stop Grenzwert

const int blinkPin = 1; //Warnblinker

void setup() {
pinMode(0, OUTPUT);
pinMode(speedM, OUTPUT);
pinMode(1, OUTPUT);
}

void MotorControl(int M_SPEED)//läuft außerhalb des Loop

{
analogWrite(speedM, M_SPEED); //Der Ausgang wird aktiviert
}

void loop()
{
int val ;
int Volt;//Irgendwie muß das ja heißen

val = analogRead(halPin);//Hallsensor einlesen
Volt = map(val, 0, 1023, 0, 1023);//Keine Einschränkung

if (Volt > threshold_1)//Wenn über Schwellwert

{
MotorControl(0);
digitalWrite(blinkPin, HIGH);//Motor steht Warnblinker
delay (400);
digitalWrite(blinkPin, LOW);
delay(400);
digitalWrite(blinkPin, HIGH);
delay (400);
digitalWrite(blinkPin, LOW);
delay(400);
digitalWrite(blinkPin, HIGH);
delay (400);
digitalWrite(blinkPin, LOW);
delay(400);
digitalWrite(blinkPin, HIGH);
delay (400);
digitalWrite(blinkPin, LOW);
delay(400);
digitalWrite(blinkPin, HIGH);
delay (400);
digitalWrite(blinkPin, LOW);
delay(400);
digitalWrite(blinkPin, HIGH);
delay (400);
digitalWrite(blinkPin, LOW);
delay(400);
}
else
{
MotorControl(120); // Geschwindigkeit des Autos
}
}


Leider passen die IR Projekte nicht.(1:87).
Außerdem würde in Kurven auch die Randbebauung als Hindernis gesehen werden. Habe ich schon zur Genüge probiert. Dann lieber fast auffahren lassen und halten.

Danke
Achim