Servo sketch for 2 IR-Sensors

I dry to upload athe Servo sketch from the Arduino libary, to my Attiny13 but get the following error message. What i am doing wrong?

In file included from /Users/amedeflum/Library/Arduino15/packages/arduino/tools/avr-gcc/5.4.0-atmel3.6.1-arduino2/avr/include/avr/io.h:99:0,
from /Users/amedeflum/Library/Arduino15/packages/arduino/tools/avr-gcc/5.4.0-atmel3.6.1-arduino2/avr/include/avr/interrupt.h:38,
from /Users/amedeflum/Library/Arduino15/packages/diy_attiny/hardware/avr/2018.9.9/libraries/Servo/src/avr/Servo.cpp:22:
/Users/amedeflum/Library/Arduino15/packages/diy_attiny/hardware/avr/2018.9.9/libraries/Servo/src/avr/Servo.cpp:137:20: error: 'OCIE1A' was not declared in this scope
TIMSK1 |= _BV(OCIE1A) ; // enable the output compare interrupt
^
Mehrere Bibliotheken wurden für "Servo.h" gefunden
Benutzt: /Users/amedeflum/Library/Arduino15/packages/diy_attiny/hardware/avr/2018.9.9/libraries/Servo
Nicht benutzt: /private/var/folders/ld/4x804xq545v2syp1c4z_c1m00000gn/T/AppTranslocation/E31C602B-4BCB-45D1-BCFD-A699358F280F/d/Arduino.app/Contents/Java/libraries/Servo
Bibliothek Servo in Version 1.1.2 im Ordner: /Users/amedeflum/Library/Arduino15/packages/diy_attiny/hardware/avr/2018.9.9/libraries/Servo wird verwendet
exit status 1
Fehler beim Kompilieren für das Board ATtiny13.

I found this Sketch, which works. Even if i dont understand it.

byte s=0;
void setup() {
pinMode(s, OUTPUT);

}

void loop() {
for (byte pos=0;pos<180;pos++)
{
pulseOut(s,pos);
delay(20);
}
}

void pulseOut( byte pin, byte p){
digitalWrite(pin,HIGH);
delayMicroseconds(300+p*(2500/180));
digitalWrite(pin,LOW);
//Serial.println(p*(1000/180));
}

This what the sketch should do on the Attiny13 at the end:

/ Servo-Library einbinden
#include <Servo.h>
 
// Servo-Objekt erzeugen
Servo myservo;
 
// Startwinkel für den Servo (Bereich 0-179 Grad)
int angle = 90;
 
 
void setup() {
// Serielle Schnittstelle initialisieren
Serial.begin(9600);
// Pin 3 als Ausgabe-Pin
pinMode(5, OUTPUT);
// Pin 3 ist Steuerpin für den Servo
myservo.attach(5);
}
 
 
void loop() {
 
// Helligkeit der beiden lichtempfindlichen Widerstände
int rightEye = analogRead(2);
int leftEye = analogRead(3);
 
// Differenz ausrechnen
int diff = (rightEye - leftEye);
 
// Wenn rechts deutlich heller als links -> 2 Grad nach rechts drehen
if (diff > 10) {
angle = angle+2;
}
 
// Wenn links deutlich heller als rechts -> 2 Grad nach links drehen
if (diff < -10) {
angle = angle-2;
}
 
// Servo max. bis 179 Grad drehen
if (angle > 130) {
angle = 130;
}
 
// Servo min. bis 0 Grad drehen
if (angle < 60) {
angle = 60;
}
 
// Grad an den Servo schicken
myservo.write(angle);
 
// Die beiden Helligkeitswerte zu Testzwecken an den PC übertragen
Serial.println(String(rightEye)+"-"+String(leftEye));
 
// Kurze Wartezeit, dann nächste Messung.
// Sollte es beim Testen der Einstellungen zu chaotisch werden,
// diesen Wert einfach auf 50 oder 100 erhöhen und damit den Vorgang verlangsamen
delay(5);
}

Draht:
I found this Sketch, which works.

Great.
Use it.

TheMemberFormerlyKnownAsAWOL:
Great.
Use it.

I Will, but first i will have to understand it and then do the changes so it will fit in my project.

You only have one eight bit timer.
You’ll just have to live with it.

TheMemberFormerlyKnownAsAWOL:
You only have one eight bit timer.
You'll just have to live with it.

your saying this not working with the ATinny13?

I gave up with the Attiny13 and did it with the Atmega328

Draht:
I gave up with the Attiny13 and did it with the Atmega328

You can drive a servo with an ATtiny13 , no problem, but you can not use the ‘servo.h’ library, you will need to send the pulse manually not using the timers.

Deva_Rishi:
You can drive a servo with an ATtiny13 , no problem, but you can not use the ‘servo.h’ library, you will need to send the pulse manually not using the timers.

See reply #2

Deva_Rishi:
You can drive a servo with an ATtiny13 , no problem, but you can not use the 'servo.h' library, you will need to send the pulse manually not using the timers.

Ah ok thank you. I will have to find out later how to do that in a way i understand.

Like i sais i did it now with the Atmega328 and the sketch works fine. My only question is could i add a part in the sketch that let servo go back to angle = 90 if after lets say 15 seconds no movement is dedected.

Hers the actual Code:

// Servo-Library einbinden
#include <Servo.h>
 
// Servo-Objekt erzeugen
Servo myservo;
 
// Startwinkel für den Servo (Bereich 0-179 Grad)
int angle = 90;
 
 
void setup() {
// Serielle Schnittstelle initialisieren
Serial.begin(9600);
// Pin 3 als Ausgabe-Pin
pinMode(5, OUTPUT);
// Pin 3 ist Steuerpin für den Servo
myservo.attach(5);
}
 
 
void loop() {
 
// Helligkeit der beiden lichtempfindlichen Widerstände
int rightEye = analogRead(2);
int leftEye = analogRead(3);
 
// Differenz ausrechnen
int diff = (rightEye - leftEye);
 
// Wenn rechts deutlich heller als links -> 2 Grad nach rechts drehen
if (diff > 10) {
angle = angle+1;
}
 
// Wenn links deutlich heller als rechts -> 2 Grad nach links drehen
if (diff < -10) {
angle = angle-1;
}
 
// Servo max. bis 179 Grad drehen
if (angle > 135) {
angle = 135;
}
 
// Servo min. bis 0 Grad drehen
if (angle < 45) {
angle = 45;
}
 
// Grad an den Servo schicken
myservo.write(angle);
 
// Die beiden Helligkeitswerte zu Testzwecken an den PC übertragen
Serial.println(String(rightEye)+"-"+String(leftEye));
 
// Kurze Wartezeit, dann nächste Messung.
// Sollte es beim Testen der Einstellungen zu chaotisch werden,
// diesen Wert einfach auf 50 oder 100 erhöhen und damit den Vorgang verlangsamen
delay(5);
}

Could this be done with a IF-Code. Something like: if (after 15000 ms no Change of analogRead(2) and analoRead(3) angle=90)

I know this has to be translated in correct c++ language.

sort of i’d do it something like this

uint32_t moment=millis();
while ((rightEye == analogRead(2)) && (leftEye == analogRead(3)) && (millis()-moment<15000)) ; // wait here
                                                                                            // if there is no change for a minimum of 15 sec.
if (millis()-moment>=15000) angle=90; //  if 15 secs have passed.

on a different note

// Pin 3 als Ausgabe-Pin
pinMode(5, OUTPUT);
// Pin 3 ist Steuerpin für den Servo
myservo.attach(5);

your comments should match your code.

@Deva_Rishi: Yes this looks interesting i will study it. I dont understand what you mean with: your comments should match your code

The comment says “pin 3”, but the code says pin 5

TheMemberFormerlyKnownAsAWOL:
The comment says "pin 3", but the code says pin 5

oops i see. i changed the Pinnumber and forgott to change the // Comment

Now i changed the Code to the sketch down below. It works nicely - Wow!

only the programm stops after the 15 seconds. I would like then to go back to the beginning when the loop starts. I tried: return; but. this doesnt work.

// Servo-Library einbinden
#include <Servo.h>
 
// Servo-Objekt erzeugen
Servo myservo;
 
// Startwinkel für den Servo (Bereich 0-179 Grad)
int angle = 90;
uint32_t moment=millis();
 
 
void setup() {
// Serielle Schnittstelle initialisieren
Serial.begin(9600);
// Pin 5 als Ausgabe-Pin
pinMode(5, OUTPUT);
// Pin 5 ist Steuerpin für den Servo
myservo.attach(5);
}
 
 
void loop() {
 
// Helligkeit der beiden lichtempfindlichen Widerstände
int rightEye = analogRead(2);
int leftEye = analogRead(3);
 
// Differenz ausrechnen
int diff = (rightEye - leftEye);
 
// Wenn rechts deutlich heller als links -> 2 Grad nach rechts drehen
if (diff > 10) {
angle = angle+1;
}
 
// Wenn links deutlich heller als rechts -> 2 Grad nach links drehen
if (diff < -10) {
angle = angle-1;
}
 
// Servo max. bis 179 Grad drehen
if (angle > 135) {
angle = 135;
}
 
// Servo min. bis 0 Grad drehen
if (angle < 45) {
angle = 45;
}

while ((rightEye == analogRead(2)) && (leftEye == analogRead(3)) && (millis()-moment<15000)) ; // wait here
                                                                                            // if there is no change for a minimum of 15 sec.
if (millis()-moment>=15000) angle=90; //  if 15 secs have passed.

// Grad an den Servo schicken
myservo.write(angle);
 
// Die beiden Helligkeitswerte zu Testzwecken an den PC übertragen
Serial.println(String(rightEye)+"-"+String(leftEye));
 
// Kurze Wartezeit, dann nächste Messung.
// Sollte es beim Testen der Einstellungen zu chaotisch werden,
// diesen Wert einfach auf 50 oder 100 erhöhen und damit den Vorgang verlangsamen
delay(5);
}