Hallo zusammen,
ich versuche derzeit eine möglichst genaue (auf die Sekunde genau )
Anzeige mittels eines Servos zu realisieren.
Der Servo Arm soll sich auf einer 100° großen Skala bewegen und dabei die
Sekunden von 0-100 anzeigen.
Hat da schon jemand Erfahrung sammeln können, ob die China Modellbau Servos
dafür genügen?
ver. Varianten für den Servo
//0.70588°/PWM_x (bei 180° Servo)
//141.6667PWM_x/° (bei max 100°, 0.70588*141,6667=~100)
//servo_pos = zaehler_dec * 2.575;
//servo_pos = zaehler_dec + 55;
servo_pos = map(zaehler_dec, 0, 99, 0, 255);
analogWrite(AQ_Pin, servo_pos);
UPDATEvollständiger Code (soll eine Eieruhr werden)
//BCD_7SEG Zaehler v1.4B (Max B. 05.10.2017)
//Zaehler +/-/reset, Ausgabe auf BCD 7-Segment 2 Digits
//min.=0; max.=99; load=60;
//wenn +/- >=1s = +/- 1Hz Takt
//////////////////////////////////////////////////////////
// UMBAU auf Sekunden mit Servo und minuten mit 2x7-SEG //
// ab 60 Sekunden Minuten += 1; bei minus -= 1; //
// //
//////////////////////////////////////////////////////////
//(UnoArduSim) #include <pgmspace.h>
//Ein-/Ausgaenge
//Analog-Eingaenge da IO-Mangel
const uint8_t S0_CU = A0; bool plus = 0;
const uint8_t S1_CD = A1; bool minus = 0;
const uint8_t S2_CR = A2; bool reset = 0;
const uint8_t S3_CL = A3; bool zload = 0;
//------------BCD_Einer------------------BCD_Zehner----
const uint8_t BCD_1_1 = 2; const uint8_t BCD_1_10 = 6;
const uint8_t BCD_2_1 = 3; const uint8_t BCD_2_10 = 7;
const uint8_t BCD_4_1 = 4; const uint8_t BCD_4_10 = 8;
const uint8_t BCD_8_1 = 5; const uint8_t BCD_8_10 = 9;
const uint8_t servo = 10;
const uint8_t alarm = 13;
//Variablen
bool s_x = 0; //Merker fuer letzte Eingabe
bool m_reset = 0; //Merker fuer Reset
byte zaehler_dec = 0; //DEC Zaehler 0-100
word zaehler_bcd = 0; //BCD Zaehler 0-160
const uint8_t zaehler_ld = 60; //Zaehlerstand laden
const uint16_t m_1s = 1000; //1 Sekunde
unsigned long j_ms = 0; //Zeitpunkt "jetzt"
unsigned long l_ms = 0; //Zeitpunkt "zuletzt"
unsigned long alarm_ms = 0; //Zeitpunkt "alarm"
uint8_t servo_pwm = 0; //Servo Position
void setup() //(OB100)
{//Start setup
Serial.begin(19200);
pinMode(S0_CU, INPUT); pinMode(S1_CD, INPUT);
pinMode(S2_CR, INPUT); pinMode(S3_CL, INPUT);
pinMode(BCD_1_1, OUTPUT); pinMode(BCD_1_10, OUTPUT);
pinMode(BCD_2_1, OUTPUT); pinMode(BCD_2_10, OUTPUT);
pinMode(BCD_4_1, OUTPUT); pinMode(BCD_4_10, OUTPUT);
pinMode(BCD_8_1, OUTPUT); pinMode(BCD_8_10, OUTPUT);
pinMode(servo, OUTPUT);
pinMode(alarm, OUTPUT);
while (!Serial) {/*NICHTS*/} //auf serielle Uebertragung warten
Serial.println(F("\nEingabe Pin: A0=plus, A1=minus, A2=reset, A3=zload"));
Serial.println(F("Ausgabe Pin: BCD_1=2-5, BCD_10=6-9"));
digitalWrite(alarm, HIGH);
Servo_test();
digitalWrite(alarm, LOW);
Serial.println(F("\nBetriebsbereit..."));
DEC_zu_BCD();
}//Ende setup
void loop() //(OB1)
{//Start loop
//Eingaenge einlesen (erspart Platz)
plus = digitalRead(S0_CU);
minus = digitalRead(S1_CD);
reset = digitalRead(S2_CR);
zload = digitalRead(S3_CL);
j_ms = millis();
//Freigabe fuer weitere Eingabe, sobald keine Taste gedrueckt ist.
if (plus + minus + reset == 0)
{
s_x = 0;
l_ms = millis(); //1Hz zaehler blockieren
}
//Taster reset
if (reset == 1 && (s_x + m_reset == 0))
{
Serial.println(F("\nReset..."));
zaehler_dec = 0;
zaehler_bcd = 0;
s_x = 1;
m_reset = 1;
Bit_lesen();
Servo_akt();
return;
}
//Taster zload
if (zload == 1 && (plus + minus + reset + s_x == 0) && zaehler_dec != 60)
{
zaehler_dec = 60;
s_x = 1;
m_reset = 0;
DEC_zu_BCD();
Bit_lesen();
Servo_akt();
return;
}
//Taster plus
if (plus == 1 && (minus + zload + reset + s_x == 0) && zaehler_dec < 99)
{
zaehler_dec += 1;
s_x = 1;
m_reset = 0;
DEC_zu_BCD();
Bit_lesen();
Servo_akt();
}
//Taster minus
if (minus == 1 && (plus + zload + reset + s_x == 0) && zaehler_dec > 0)
{
zaehler_dec -= 1;
s_x = 1;
m_reset = 0;
DEC_zu_BCD();
Bit_lesen();
Servo_akt();
}
//zaehlen mit 1Hz
if ((j_ms - l_ms >= m_1s) && ((plus == 1 && zaehler_dec < 99) || (minus == 1 && zaehler_dec > 0)))
{
s_x = 0; //weiteres zaehlen freigeben
l_ms = millis();
}
//Alarm ab 99 oder ab 0 wenn minus aktiv
if ((zaehler_dec >= 99 || (zaehler_dec < 1 && minus == 1)) && (j_ms - alarm_ms >= m_1s))
{
digitalWrite(alarm, digitalRead(alarm) ^ 1);
alarm_ms = millis();
}
else if ((zaehler_dec < 99 && minus == 0) || (zaehler_dec > 0 && minus == 1))
{
digitalWrite(alarm, LOW);
}
}//Ende loop
void DEC_zu_BCD() //(FC1)
{
//|-BCD-----=--------DEC-------HEX----+-------MOD(10)-|
zaehler_bcd = (zaehler_dec / 10 * 16) + (zaehler_dec % 10);
Serial.print(F("Zaehlerstand = "));
Serial.print(zaehler_dec);
Serial.print(F(" | BCD = "));
Serial.println(zaehler_bcd, BIN);
}
void Bit_lesen() //(FC2)
{
//erste 4Bit "Einer"
digitalWrite(BCD_1_1, bitRead(zaehler_bcd, 0));
digitalWrite(BCD_2_1, bitRead(zaehler_bcd, 1));
digitalWrite(BCD_4_1, bitRead(zaehler_bcd, 2));
digitalWrite(BCD_8_1, bitRead(zaehler_bcd, 3));
//letzte 4Bit "Zehner"
digitalWrite(BCD_1_10, bitRead(zaehler_bcd, 4));
digitalWrite(BCD_2_10, bitRead(zaehler_bcd, 5));
digitalWrite(BCD_4_10, bitRead(zaehler_bcd, 6));
digitalWrite(BCD_8_10, bitRead(zaehler_bcd, 7));
}
void Servo_test() //(FC3)
{
Serial.print(F("Servo wird geprueft..."));
uint8_t x = 188;
for (x; x > 0; x--)
{
analogWrite(servo, x);
delay(10);
}
for (x; x < 188; x++)
{
analogWrite(servo, x);
delay(10);
}
Serial.println(F("fertig"));
}
void Servo_akt() //(FC4)
{
servo_pwm = map(zaehler_dec, 0, 60, 188, 1);
//absichern des servos, da ab +60 wert ~255;
//wird ueberfluessig durch begrenzung des zaehlers auf sekunde
servo_pwm = constrain(servo_pwm, 1, 188);
analogWrite(servo, servo_pwm);
}