Med en ACS712 och Arduino för att upptäcka manöverdonet gränser (5 / 6 steg)
Steg 5: Låt oss kalibrera!
Så nu är allt som återstår att tillämpa det vi lärt oss från föregående steg.
Om du laddar upp den kod som följer, bör du se din ställdon kommer till liv och sträcka det är ben.
Observera att ACTUATOR_SPEED är konstant på 255 (max). Du kan använda den här tekniken och använda den variabel hastighet att PWM tillhandahåller, men du måste ha PWM i full fart innan du provar ACS712. Om du sänker den variabeln säga 200, ser du att du ibland träffar avläsningar nära resten (512). Det beror på att registeransvarige är inte sänka spänningen att sänka hastigheten, men i stället pulserande 12Vin till DC-motor som om någon står på en strömbrytare och vrida den på och av över och över. Om du prova den nuvarande sensorn inte samtidigt full, du sannolikt att prova en ingen aktuell läsning falskt.
/ * < Br > varje några minuter, flytta manöverdonet genom det är full rörelseomfång och rapportera tid,
begränsa upptäckt och andra användbara diagnostiska information
Testad på Arduino Uno Cytron MD10 10A motor sköld driver en Figerelli 30"/ 400£
manöverdon.
Större manöverdonen har byggt i gränser som stoppa motorn, men inget sätt att tala om
den registeransvarige att manöverdonet är vid sin gräns. Med hjälp av en ACS712 hall effekt sensor
modul ansluten till ACTUATOR_AMP_SENSOR_PIN, upptäcka vi när manöverdonet ska vara
flytta men motorn drar inte någon ström.
*/
#define ACTUATOR_AMP_SENSOR_PIN A5
#define ACTUATOR_PWM_PIN 11
#define ACTUATOR_DIR_PIN 12
Maxhastighet är 255 - detta är det värde som skrivs till ACTUATOR_PWM_PIN
#define ACTUATOR_SPEED 255
När amp sensor analoga värde är mellan dessa, är det att vara i vila (nr
aktuella dras.
#define ZEROAMP_RANGE_LOW 505
#define ZEROAMP_RANGE_HIGH 520
begränsade till 255 röding strängar
void serialPrintf (char const * format,...) {
char buffer [255];
VA_LIST args;
va_start (args, format);
vsprintf (buffert, format, args);
va_end(args);
Serial.println(buffer);
}
booleska isActuatorMoving() {
int val = analogRead(ACTUATOR_AMP_SENSOR_PIN);
serialPrintf ("Amp sensor läsa: %d", val);
returnera val < ZEROAMP_RANGE_LOW || Val > ZEROAMP_RANGE_HIGH;
}
void moveActuator (int riktning, int hastighet = ACTUATOR_SPEED) {
serialPrintf ("flytta manöverdonet riktning = %d, hastighet = %d", riktning, hastighet);
analogWrite (ACTUATOR_PWM_PIN, hastighet);
digitalWrite (ACTUATOR_DIR_PIN, riktning);
Delay(200);
}
void stopActuator() {
analogWrite (ACTUATOR_PWM_PIN, 0);
}
Returnerar antalet milleseconds tas
osignerade långa moveActuatorToEnd(int direction) {
lång startMs = millis();
moveActuator(direction);
Delay(100);
samtidigt (millis() - startMs < 2000) {
Delay(1);
//}
samtidigt (isActuatorMoving()) {
Delay(300); viss fördröjning mellan provtagning modulen ACS712 rekommenderas
}
stopActuator();
lång endMs = millis();
återgå endMs - startMs;
}
Rutinen installationsprogrammet körs en gång när du trycker på reset:
void setup() {
initiera seriell kommunikation på 9600 bitar per sekund:
Serial.BEGIN(9600);
pinMode (ACTUATOR_PWM_PIN, OUTPUT);
pinMode (ACTUATOR_DIR_PIN, OUTPUT);
pinMode (ACTUATOR_AMP_SENSOR_PIN, indata);
serialPrintf ("setup komplett");
}
loop rutinen körs för evigt om och om igen:
void loop() {
int currentDirection = 0;
om (isActuatorMoving()) {
serialPrintf ("fel: avkänning rörelse på manöverdonet när det inte borde vara");
Delay(250);
hemkomst.
}
börja i ena änden det bör redan vara slut om inte manöverdonet startade slingan
i mitten. Vi kunde testa att det tar mindre än n tid till första slutet på
därpå följande iterationer av loop()
moveActuatorToEnd(currentDirection);
Delay(2000);
för (int jag = 0; jag < 2; i ++) {
currentDirection = (currentDirection + 1) % 2. 0 -> 1, 1 -> 0
långa ttm = moveActuatorToEnd(currentDirection);
serialPrintf ("flyttade slutpunkt till slutpunkt (%d) i % ldms", currentDirection, ttm);
Delay(1000);
}
Delay(10000);
}