Servosteuerung mit Attiny84

Werte Mitglieder,

ich habe eine Servosteuerung für einem Arduino UNO geschrieben mit der ich als Anfänger vorerst einmal zufrieden bin. Es gibt aber sicher noch einiges zu verbessern.

Warum ich aber hier einen Eintrag schreibe ist folgender. Geplant ist das ich anstatt des Arduino einen ATtiny84 verwende. Jetzt würde ich gerne wissen, auf was ich bei der Programmierung achten muss, welche Bibliotheken ich verwenden kann (Servo.h?) oder ob das Programm einfach auf den ATtiny84 übertragen werden kann. Natürlich müssen die verwendeten Eingangs/Ausgangs Pin angepasst werden.

Für Tipps und Ratschläge wäre ich sehr dankbar.

#include <EEPROM.h>
#include <Servo.h>

int tasterG = 2;                                       // eingangspin für grün
int tasterR = 4;                                       // eingangspin für rot
int prog = 6;                                          // eingangspin für programmier modus
int plus = 12;                                         // eingangspin plus taste
int minus = 13;                                        // eingangspin minus taste
int aktpos;                                            // aktuelle servo position
int ledakt;                                            // aktueller LED status
int addressaktpos = 0;                                 // speicheradresse im EEPROM für servoposition
int addresssollg = 1;                                  // speicheradresse im EEPROM für sollposition grün
int addresssollr = 2;                                  // speicheradresse im EEPROM für sollposition rot
int addressled = 3;                                    // speicheradresse im EEPROM für LED status
int addressbetrieb = 4;                                // speicheradresse im EEPROM für betriebsstatus
int ledPin = 7;                                        // LED an PIN 7
int sollg;                                             // sollposition grün
int sollr;                                             // sollposition rot
int betrieb;                                           // betriebsstatus 0 = neu, 1 = betrieb

Servo _Servo;                                          // servo object zum steuern eines servo

void setup()
{
Serial.begin(9600);
aktpos = EEPROM.read(addressaktpos);                   // letzte servoposition aus EEPROM
ledakt = EEPROM.read(addressled);                         // letzter LED status aus EEPROM
sollg = EEPROM.read(addresssollg);                        // letzte sollposition grün aus EEPROM
sollr = EEPROM.read(addresssollr);                          // letzte sollposition rot aus EEPROM
betrieb = EEPROM.read(addressbetrieb);                  // betriebsstatus aus EEPROM
pinMode(tasterR, INPUT);
pinMode(tasterG, INPUT);
pinMode(ledPin, OUTPUT);
pinMode(prog, INPUT);
pinMode(plus, INPUT);                                     
pinMode(minus, INPUT);                                    
_Servo.attach(9);                                       // servo an PIN 9
_Servo.write(aktpos);                                 // servo auf letze position stellen
_Servo.detach();                                        // servo abschalten
digitalWrite(ledPin, ledakt);                        // letzten LED status herstellen
}

int schalten (int PIN, int soll, int aktpos, int Pause) // schalten(servo PIN, sollposition, istposition, Pause)
{  
  _Servo.attach(PIN);
  if (soll>aktpos); {
    EEPROM.write(addressaktpos,soll);                    // sollposition von servo speichern   
    for(aktpos; aktpos<=soll; aktpos++) {
     _Servo.write(aktpos);                                        // servoposition um 1 grad erhöhen,
     delay(Pause);
    }
  }
  if (soll<aktpos); {
    EEPROM.write(addressaktpos,soll);                    // sollposition von servo speichern    
    for(aktpos; aktpos>=soll; aktpos--) {
      _Servo.write(aktpos);                                       // servoposition um 1 grad veringern,
      delay(Pause);
    }    
  }
  _Servo.detach();                                                  // servo abschalten
  Serial.println(aktpos);
  return aktpos;
}

void loop() 
{

if (betrieb == LOW)                                // initialisierung wenn noch keine werte im EEPROM gespeichert sind
{ 
   Serial.println(betrieb);  
   aktpos = 50;                                       // servoposition rot
   sollg = 130;                                        // sollposition grün 
   sollr = 50;                                           // sollposition rot
   _Servo.attach(9);                                  // servo an PIN 9
   _Servo.write(aktpos);                            // servo auf position rot stellen
   delay(150);
   betrieb = HIGH;                                   // es werden nun die werte aus dem EEPROM verwendet
   EEPROM.write(addressbetrieb,HIGH);    // betriebsstatus im EEPROM speichern
   Serial.println(betrieb);
   ledakt = LOW;                                     // LED status rot
}

if (digitalRead(prog) == HIGH)                          // programmiermodus für endlage
{
   _Servo.attach(9);
   if (ledakt == HIGH)                                        // LED grün leuchtet
   {
   Serial.println("Grüne Endlage");                       // grüne endlage
   if (digitalRead(plus) == HIGH)                         // + taste gedrückt  
     {
     aktpos++;            
     _Servo.write(aktpos);                                     // servo position erhöhen
     Serial.println(aktpos);
     }
   if (digitalRead(minus) == HIGH)                       // - taste gedrückt  
     {  
     aktpos--;
     _Servo.write(aktpos);                                     // servo position verringern
     Serial.println(aktpos);
     }
   sollg = aktpos;                                               // grüne sollposition ist aktuelle position
   Serial.println(sollg);
   delay(100);
   }
  
   if (ledakt == LOW)                                          // LED rot leuchtet
   {
   Serial.println("Rote Endlage");                           // rote endlage
   if (digitalRead(plus) == HIGH)                           // + taste gedrückt                         
     {
     aktpos++;
     _Servo.write(aktpos);
     Serial.println(aktpos);
     }
   if (digitalRead(minus) == HIGH)                         // - taste gedrückt   
     {
     aktpos--;
     _Servo.write(aktpos);
     Serial.println( aktpos);
     }
   sollr = aktpos;
   Serial.println(sollr);
   delay(100);
  }
}

if (digitalRead(tasterR) == LOW && aktpos > 90)          // taste rund gedrückt und Servoposition gerade
    {
    digitalWrite(ledPin, LOW);                                        // LED rot leuchtet
    EEPROM.update(addressled, LOW);                         // LED status speichern
    EEPROM.update(addresssollr,sollr);                         // sollposition rot speichern      
    ledakt = LOW;
    aktpos = schalten(9, sollr, aktpos, 20);                     // servo schalten(Pin, Sollrot, aktpos, Geschwindigkeit);
    }
if (digitalRead(tasterG) == LOW  && aktpos < 90)         // taste gerade gedrückt und servoposition rund
    {
    digitalWrite(ledPin, HIGH);                                        // LED grün leuchtet
    EEPROM.update(addressled, HIGH);                          // LED status speichern
    EEPROM.update(addresssollg,sollg);                         // sollposition grün speichern     
    ledakt = HIGH;
    aktpos = schalten(9, sollg, aktpos, 20);                      // servo schalten(Pin, Sollgrün, aktpos, Geschwindigkeit);  
    }
}

Meist steht es in der verwendeten Library drin, ob diese für den jeweiligen ATtiny geeignet ist.
Da wir nicht wissen, welche Libraries du verwendest, ist es für dich einfacher, da nachzuschauen.

Hallo Dieter,

ich bedanke mich für die Rückmeldung. Inzwischen bin ich bereits etwas schlauer und habe es geschaft den Tiny mit der SW zu programmieren. Es hat natürlich am Anfang nicht geklappt aber als ich die EEPROM zeilen entfernt habe funktioniert es so wie ich es wollte.

Jetzt habe ich das Problem wie bringe ich die SW mit den EEPROM Funktionen mit dem Tiny84 zum laufen. Ich möchte ja die im Betrieb angepassten Werte speichern damit diese bei einem Neustart (Spannung ist wieder vorhanden) auch vorhanden sind.

Für Tipps und Hinweise wäre ich sehr dankbar.

marbin65:
Es hat natürlich am Anfang nicht geklappt aber als ich die EEPROM zeilen entfernt habe funktioniert es so wie ich es wollte.

Der Code aus deinem ersten Post compiliert bei mir für den ATtiny84 ohne Fehlermeldung.

marbin65:
Jetzt habe ich das Problem wie bringe ich die SW mit den EEPROM Funktionen mit dem Tiny84 zum laufen. Ich möchte ja die im Betrieb angepassten Werte speichern damit diese bei einem Neustart (Spannung ist wieder vorhanden) auch vorhanden sind.

Versuche deinen Code aus dem ersten Post nochmal, und teile uns mit was nicht funktioniert bzw. welche Fehlermeldung du beim compilieren bekommst.

Ich nutze diese zusätzliche Boardverwalter-URL für ATtiny:
http://drazzy.com/package_drazzy.com_index.json

gruß lorenz

Hallo Lorenz,

Danke für die Rückmeldung. Es gab keine Fehlermeldung beim compilieren sondern das Programm lief nicht so wie es mit dem UNO funktionierte. Daher habe ich vermutet es liegt an den EEPROM Zeilen. Inzwischen habe ich “herumgedocktert” und siehe da auf einmal funktioniert es. Keine Ahnung was nun der Grund dafür war.

Ich poste einmal den aktuellen Code (ich hoffe ich mach es richtig) Er ist sicher nicht professionell, und denke spezialisten habe da sicher einiges zum verbessern. Ich habe mir auch schon einen Print gebastelt auf dem ich das nun testen werde. Ist ja etwas anderes als am Breadboard. Mal sehen ob es da auch noch funkt :slight_smile:

LG Mario

#include <EEPROM.h>
#include <Servo.h>

int tasterG = 10;                                      // eingangspin für grün (PIN 2 PB0) 
int tasterR = 9;                                       // eingangspin für rot (PIN 3 PB1) 
int prog = 2;                                          // eingangspin für programmier modus (PIN 11 PA2)
int progmod = LOW;                                     // programmiermodus aus
int plus = 0;                                          // eingangspin plus taste (PIN 13 PA0)
int minus = 1;                                         // eingangspin minus taste (PIN 12 PA1)
int aktpos;                                            // aktuelle servo position
int ledakt;                                            // aktueller LED status
int addressaktpos = 0;                                 // speicheradresse im EEPROM für servoposition
int addresssollg = 1;                                  // speicheradresse im EEPROM für sollposition grün
int addresssollr = 2;                                  // speicheradresse im EEPROM für sollposition rot
int addressbetrieb = 4;                                // speicheradresse im EEPROM für betriebsstatus
int ledPin = 3;                                        // LED (PIN 10 PA3)
int sollg;                                             // sollposition grün
int sollr;                                             // sollposition rot
int betrieb;                                           // betriebsstatus 0 = neu, 1 = betrieb


Servo _Servo;                                          // servo object zum steuern eines servo

void setup()
{
Serial.begin(9600);
aktpos = EEPROM.read(addressaktpos);                   // letzte servoposition aus EEPROM
sollg = EEPROM.read(addresssollg);                     // letzte sollposition grün aus EEPROM
sollr = EEPROM.read(addresssollr);                     // letzte sollposition rot aus EEPROM
betrieb = EEPROM.read(addressbetrieb);                 // betriebsstatus aus EEPROM


pinMode(tasterR, INPUT);
pinMode(tasterG, INPUT);
pinMode(ledPin, OUTPUT);
pinMode(prog, INPUT);
pinMode(plus, INPUT);                                     
pinMode(minus, INPUT);                                    
_Servo.attach(7);                                       // servo an (PIN 6 PA7)
_Servo.write(aktpos);                                   // servo auf letze position stellen
_Servo.detach();                                        // servo abschalten

}

int schalten (int PIN, int soll, int aktpos, int Pause) // schalten(servo PIN, sollposition, istposition, Pause)
{  
  _Servo.attach(PIN);
  if (soll>aktpos); {
    EEPROM.write(addressaktpos,soll);                    // sollposition von servo speichern   
    for(aktpos; aktpos<=soll; aktpos++) {
     _Servo.write(aktpos);                               // servoposition um 1 grad erhöhen,
     delay(Pause);
    }
  }
  if (soll<aktpos); {
    EEPROM.write(addressaktpos,soll);                    // sollposition von servo speichern    
    for(aktpos; aktpos>=soll; aktpos--) {
      _Servo.write(aktpos);                              // servoposition um 1 grad veringern,
      delay(Pause);
    }    
  }
  _Servo.detach();                                       // servo abschalten
  return aktpos;
}

void loop() 
{

if (aktpos > 90){
  digitalWrite(ledPin, HIGH);                           // LED grün leuchtet
  }
  else {
  digitalWrite(ledPin, LOW);                            // LED rot leuchtet
  }
  
if (betrieb == LOW)                                     // initialisierung wenn noch keine werte im EEPROM gespeichert sind
{ 
   aktpos = 50;                                         // servoposition rot
   sollg = 130;                                         // sollposition grün 
   sollr = 50;                                          // sollposition rot
   _Servo.attach(7);                                    
   _Servo.write(aktpos);                                // servo auf position rot stellen
   delay(150);
   betrieb = HIGH;                                      // es werden nun die werte aus dem EEPROM verwendet
   EEPROM.write(addressbetrieb,HIGH);                   // betriebsstatus im EEPROM speichern
   ledakt = LOW;                                        // LED status rot
}

if (digitalRead(prog) == LOW)                           // programmierpin auf +
{
   progmod = HIGH;                                      // programmiermodus für endlagen                                 
   _Servo.attach(7);                                    
   if (ledakt == HIGH)                                  // LED grün leuchtet, grüne endlage
   {                                              
   if (digitalRead(plus) == LOW)                        // + taste gedrückt  
     {
     aktpos++;            
     _Servo.write(aktpos);                              // servo position erhöhen
     }
   if (digitalRead(minus) == LOW)                       // - taste gedrückt  
     {  
     aktpos--;
     _Servo.write(aktpos);                              // servo position verringern
     }
   sollg = aktpos;                                      // grüne sollposition ist aktuelle position
   delay(100);
   }
  
   if (ledakt == LOW)                                   // LED rot leuchtet, rote endlage
   {                      
   if (digitalRead(plus) == LOW)                        // + taste gedrückt                         
     {
     aktpos++;
     _Servo.write(aktpos);
     }
   if (digitalRead(minus) == LOW)                       // - taste gedrückt   
     {
     aktpos--;
     _Servo.write(aktpos);
     }
   sollr = aktpos;
   delay(100);
  }
}

if (digitalRead(prog) == HIGH && progmod == HIGH)         // programmiermodus beendet
   {  
   EEPROM.update(addresssollr,sollr);                     // sollposition rot speichern   
   EEPROM.update(addresssollg,sollg);                     // sollposition grün speichern        
   progmod = LOW;
   }

if (digitalRead(tasterR) == LOW && aktpos > 90)           // taste rund gedrückt und Servoposition gerade
    {
    digitalWrite(ledPin, LOW);                            // LED rot leuchtet
    ledakt = LOW;
    aktpos = schalten(7, sollr, aktpos, 20);              // servo schalten(Pin, Sollrot, aktpos, Geschwindigkeit);
    }
if (digitalRead(tasterG) == LOW  && aktpos < 90)          // taste gerade gedrückt und servoposition rund
    {
    digitalWrite(ledPin, HIGH);                           // LED grün leuchtet  
    ledakt = HIGH;
    aktpos = schalten(7, sollg, aktpos, 20);              // servo schalten(Pin, Sollgrün, aktpos, Geschwindigkeit);  
    }
}

Freut mich dass es läuft und Danke für die Rückmeldung!

Gern geschehen.... :wink:

This topic was automatically closed 120 days after the last reply. New replies are no longer allowed.