scratch arduino (automatisch luikje)

Hallo allemaal,

Ik ben bezig om een luikje te maken (voor de kippen :) . Die moet open gaan als het licht wordt en weer dicht als het donker wordt.

De Arduino heb ik nu werkend en alles is aangesloten volgens schema (zie bijlage). Deze heb ik gevonden op internet en daar zat de volgende programering bij (zie onder)

Deze heb ik geupload naar de Anduiro en heb de stekker erin gedaan. Nu gebeurd het volgende....de motor draait eerst 5 seconden en gaat daarna de andere kant opdraaien en blijft dit dan ook doen (ook als ik de magneetswitch er tegen aan houd). Ik heb het idee dat die in een soort veilige modus zit o.i.d. Als ik de blauwe stekker van pin A1 op de anduiro eruit haal dan stopt de motor. Als ik dan dat blauwe stekkertje weer aansluit op pen A1 dan gaat het lampje TX op de Anduiro knipperen. Na een klein minuutje begint de motor weer te draaien.

Ik ben een leek op dit gebied en het is mijn eerste project, maar waar kan ik nu vinden waar het niet goed gaat. Klopt het schema wel met de bijhorende scratch? Of zal het probleem ergens anders liggen? Er gebeurd in ieder geval wel wat :-)

code:

/*
  Kippenluik
  ground vanaf controller
  Vin vanaf 5 volt controller
*/

int LuikGoedemorgen = 290;        // lichtwaarde wanneer luik open
int LuikWelterusten = 35;         // lichtwaarde wanneer luik dicht
int LuikPulsen = 100;             // aantal pulsen om Luik neer te laten gaan (open gaat tot magnetische switch) 1 cm=2,6 seconden. 36 cm = 94 seconden ongeveer 100 pulsen voor de zekerheid

const int LuikMetingen = 5;       // het gemiddelde van aantal metingen waarop beslist wordt
const int intervalwaarde = 60;    // aantal seconden pause tussen metingen
const int motortin1Pin = 4;       // controller in1  D4
const int motortin2Pin = 5;       // controller in2  D5
const int magneetPin = A1;        // magneetswitch   A1
const int ldrPin = A2;            // LDR             A2

// variabelen
int intervalteller = 0;
int Luikstatus = 1;               // luik status 1=open, 0=dicht
int intMeetMoment = 0;            // positie in array met lichtmetingen
uint16_t Licht[LuikMetingen];     // array met de lichtmetingen


/*************************/
void setup(void) {
  /*************************/

  Serial.begin(57600);
  Serial.println("Kippenluik. Copyright Techniek & Dier");

  pinMode(motortin1Pin, OUTPUT);
  pinMode(motortin2Pin, OUTPUT);
  pinMode(ldrPin, INPUT);           //ldr+plus en ldr+port+10k
  pinMode(magneetPin, INPUT_PULLUP);       //tussen 0 en de pin

  // meetwaarde array vullen met een default gemiddelde
  for (int teller = 0; teller < LuikMetingen; teller++) {
    Licht[teller] = (LuikGoedemorgen + LuikWelterusten) / 2;
  }

  // variablen setten
  Luikstatus = 0;
  intMeetMoment = 0;

  // bij boot wordt 5 seconden gesloten en daarna geopend ivm sync van de motor en veiligste modus.
  Testluik();

}

/*************************/
void Testluik(void) {
  /*************************/
  digitalWrite(motortin1Pin, LOW);
  digitalWrite(motortin2Pin, HIGH);
  for (int teller = 0; teller < 5; teller++) delay(1000);
  OpenLuik();
}

/*************************/
void SluitLuik(void) {
  /*************************/
  digitalWrite(motortin1Pin, LOW);
  digitalWrite(motortin2Pin, HIGH);
  for (int teller = 0; teller < LuikPulsen; teller++) delay(1000);
  // motor uit
  digitalWrite(motortin1Pin, LOW);
  digitalWrite(motortin2Pin, LOW);
}

/*************************/
void OpenLuik(void) {
  /*************************/
  while (digitalRead(magneetPin) == 0) { //lees de switch uit 0=nog niet boven
    digitalWrite(motortin1Pin, HIGH);
    digitalWrite(motortin2Pin, LOW);
  }
  // motor uit
  digitalWrite(motortin1Pin, LOW);
  digitalWrite(motortin2Pin, LOW);
}

/*************************/
void ProcesLuik(void) {
  /*************************/

  uint16_t gemiddelde = 0;

  //haal lichtmeting op
  Licht[intMeetMoment] = analogRead(ldrPin); // gemeten waarde in de array zetten
  intMeetMoment++;                         // verhoog positie in de array
  if (intMeetMoment >= LuikMetingen) intMeetMoment = 0; // als array gevuld is dan weer vooraf beginnen met vullen

  // gemiddelde van de array berekenen
  gemiddelde = 0;
  for (int teller = 0; teller < LuikMetingen; teller++) {
    gemiddelde += Licht[teller];
  }
  gemiddelde = gemiddelde / LuikMetingen;

  // beslissen of luik open, dicht of blijven moet
  if ((gemiddelde <= LuikWelterusten) && (digitalRead(magneetPin) == 1)) { // luik moet openstaan 1=luik is bovenaan
    SluitLuik();
    Luikstatus = 1;
  }

  if (gemiddelde >= LuikGoedemorgen) {
    OpenLuik();
    Luikstatus = 0;
  }

}

/*************************/
void loop(void) {
  /*************************/

  //taakafhandeling. Moet elke minuut
  intervalteller = 0;
  while (intervalteller < intervalwaarde) {
    delay(1000);
    intervalteller++;
    Serial.print("LDR waarde: ");
    Serial.print(analogRead(ldrPin));
    Serial.print("  Luikstatus: ");
    Serial.print(Luikstatus);
    Serial.print("  Magneetswitch: ");
    Serial.println(digitalRead(magneetPin));

  }

  ProcesLuik();
}
      

Kijk, dat is nog eens een duidelijke startpost, hulde!

Het lijkt een probleem met de sensor te zijn, want deze verandert niet van status (anders zou de motor wel stoppen met draaien).

In je loop() functie print je elke seconde al de status van de magneetsensor. Wat doet deze zodra je de magneet ervoor houdt, krijg je dan enen en nullen? Houd je de magneet op de juiste manier ervoor? De sensor zal alleen in een bepaalde richting gevoelig zijn.

Diverse projecten en experimenten: www.elexperiment.nl

Heel erg bedankt voor je reactie.

Weet je ook hoe ik dat moet testen van die magneetsensor. Moet ik dan gewoon de Arduino aansluiten op de USB en dan naar het Arduino programma gaan?

Is binnen dat programma van Arduino dan een optie om die 1 en 0 te moeten zien?

Binnen de Arduino IDE heb je onder tools iets van monitor zitten. Dat is eigenlijk gewoon een terminal waarmee je op de UART poort van je board aansluit. Je kunt ook Putty, HTerm of zo gebruiken. De serial.print commandos printen op die poort, en dat wordt dus zichtbaar in de terminal. Handig voor debuggen (maar onzin in je uiteindelijke ontwerp).

Of je sensor werkt kun je ook prima met een voltmeter meten natuurlijk.

"We cannot solve our problems with the same thinking we used when we created them" - Albert Einstein
big_fat_mama

Zie Paulinha_B

Ik doe altijd

code:

picocom --baud 38400 /dev/ttyUSB0

Let wel, je moet dat stoppen voordat je de volgende upload gaat doen, toch zeker als je dat vanuit de IDE doet (het kan ook vanaf de command line).

/dev/ttyUSB0 kan ook USB1 zijn als je herhaaldelijk uit- en inplugt, dan moet je ook de IDE bijstellen.

Dit alles uitgaande van een Linux-achtige omgeving, en die picocom moet je wel installeren natuurlijk:

code:

apt install picocom

Zou het overigens kunnen dat je met "scratch" eigenlijk "sketch" bedoelt? Beetje verwarrend... Toegegeven dat het ook redelijk belachelijk is om niet gewoon van een programma te spreken, de term "sketch" past erop als een tang op een varken.

hoe beter de vraag geschreven, zoveel te meer kans op goed antwoord

Niet moeilijker maken dan het is, de Serial monitor zit ingebouwd in de Arduino IDE: https://learn.adafruit.com/adafruit-arduino-lesson-5-the-serial-monito…

Dus, simpelweg Arduino verbinden met de PC en de serial monitor openen. In je code staan al regels die de sensorwaarde naar de PC sturen (een keer per seconde, eventueel kun je dat wat sneller zetten door de delay(1000) te verkorten).

Diverse projecten en experimenten: www.elexperiment.nl
big_fat_mama

Zie Paulinha_B

Niet moeilijker maken dan het is

Daar stem ik grif mee in, maar er zijn ook lieden (m/v) die, om welke reden ook, de IDE liever niet gebruiken.

Als men er eenmaal wel mee in zee gaat dan maar beter alles eruit halen wat erin zit, ja, dat wel.

hoe beter de vraag geschreven, zoveel te meer kans op goed antwoord

Heel erg bedankt voor de reacties.

Als ik mijn Anduiro aansluit en de stekker erin doe. Dan komt via de monitor in IDE het volgende in beeld (zie voorbeeld 1 / test_1)...verder gebeurd er niks.

Als ik dan de stekker "magneetswitch A1" uit de Anduiro haal en er weer in doe dan begint het lampje TX op de anduiro knipperen en komen er om de seconde deze vage tekens in beeld (zie voorbeeld 2 / test_2).

De magneetswitch doet helemaal niks als ik die er tegen aan houd. Ik zie dan geen 1 of 0 in beeld of andere tekens verschijnen.

Ik heb ook geen idee waarom het lampje TX begint te knipperen als ik de stekker van de magneet uit de anduiro haal. Dan knippert die een klein minuutje en dan begint de motor weer te draaien.

Heeft iemand een idee wat die tekens zijn wat er in beeld verschijnt? Misschien is het beter dat ik alles weer uit elkaar haal?

Shiptronic

Overleden

Verkeerde instelling van de Com poort, snelheid PC en Arduino moeten gelijk zijn als ze met elkaar willen babbelen.

Dit zijn een van de meest gebruikelijke :

Maar ik mis al iets als klok frequentie in je config.

[Bericht gewijzigd door Shiptronic op zaterdag 29 september 2018 20:06:20 (14%)

Wie de vraag stelt, zal met het antwoord moeten leren leven.
big_fat_mama

Zie Paulinha_B

Dat is natuurlijk een Windhoos-only plaatje. Maar vermits T/S niet aangeeft welk O/S er gebruikt wordt, zou het inderdaad wel eens ellende uit die hoek kunnen zijn.

hoe beter de vraag geschreven, zoveel te meer kans op goed antwoord

De TS gebuikt de Arduino IDE, dus we kunnen er wel vanuit gaan dat het plaatje overeenkomt. Zoveel mensen gebruiken ook geen Linux, dus de aanname lijkt me wel kunnen.

TS, je hebt in de software de baudrate op 57600 gezet, dus de monitor moet op diezelfde rate staan. Snap je verder wel wat het programma doet, of is het copy/paste en verder niks?

"We cannot solve our problems with the same thinking we used when we created them" - Albert Einstein

Zie dat eerste plaatje. Daar staat 9600 bautrate. Even daar wijzigen naar 57600 . Dat is de serial snelheid in de sketch.

Bedankt voor de reacties. Ik krijg nu inderdaad resultaten (het lag dus aan de instellingen). Ook zie ik dat de LDR sensor ook waardes geeft.

Maar inderdaad de magneetswitch blijft op 0 staan ook als ik de magneten bij elkaar houd. Ik denk dat ik daar eerst maar even goed na moet kijken.

Ik heb eigenlijk niet echt een idee wat het programma doet...ben echt nog een leek op dit gebied.

Kan ik de magneten ook testen of deze het überhaupt wel doen?

Misschien door middel van een scriptje voor de Anduiro?

Magneten "doen" het altijd, staan nooit uit :-) Maar die sensor zou je gewoon moeten kunnen meten. Lijkt me handig om daarmee te beginnen. Als dat niet werkt doet die software ook niks.

Maar ehm, die software zou ik toch ook maar eens bekijken anders wordt het wel lastig om te snappen wat er gebeurd. En aanpassen al helemaal.

"We cannot solve our problems with the same thinking we used when we created them" - Albert Einstein
buckfast_beekeeper

Golden Member

Vervang de magneet switch eens door 2 draadjes die je wel en niet tegen elkaar houdt. Je zou dan een wijzigende tekst moeten krijgen. Krijg je dat niet, zit er een probleem in je programma of de I/O die je gebruikt.

Werkt dat wel, dan kan je de magneet switch uitmeten met een multimeter in Ohm stand. Naargelang het een maak of een breek contact is krijg je een ander resultaat. Bij een maak, waar volgens mij wordt van uitgegaan, dan moet je ongeveer 0Ω meten met de magneet er tegenaan. Oneindig als de magneet weg is. Bij een breekcontact omgekeerd.

Brengt een 10k weerstand naar + soelaas? Ken verder niks van toneeltje spelen. Kan dus niet beoordelen of de interne pull-up wordt actief gemaakt. edit: vermoedelijk wel

c code:

pinMode(magneetPin, INPUT_PULLUP);
Van Lambiek wordt goede geuze gemaakt.

Ja ik heb de magneet switch vervangen door twee losse draden. Als ik nu kijk dan komen er 1tjes te staan, maar als ik de draden tegen elkaar aan doe dan komen er ook nulletjes bij.

Zou dit toch een probleem met de magneet switch kunnen zijn? Of kan het ook nog zo zijn dat het niet goed is aangesloten?

In de software kan het denk ik niet zitten, omdat die wel de waardes weergeeft toch?

Blijft lastige materie :-)

Knap denkwerk :p
De sensor doet niet wat je verwacht, dat is duidelijk. Geen idee wat je daar aan hardware hebt, dus beide kan: stuk of niet goed aangesloten. Daarom zei ik hierboven al: eerst eens meten. Je weet nu dat het niet in de software zit, dus dan moet het hardware zijn. Of je houdt het magneetje er niet goed voor, gebruikersfout, kan ook nog.

"We cannot solve our problems with the same thinking we used when we created them" - Albert Einstein

Ja inderdad het de magneetsensor is het probleem. De rest doet het namelijk wel. Als ik de Lichtsensor afdek dan gaat de motor na ongeveer een paar minuten draaien en geeft daarna het de volgende resultaten:

LDR waarde: 1 Luikstatus: 0 Magneetswitch: 1
LDR waarde: 1 Luikstatus: 0 Magneetswitch: 1
LDR waarde: 1 Luikstatus: 0 Magneetswitch: 1
LDR waarde: 0 Luikstatus: 0 Magneetswitch: 1
LDR waarde: 1 Luikstatus: 0 Magneetswitch: 1
LDR waarde: 1 Luikstatus: 0 Magneetswitch: 1
LDR waarde: 0 Luikstatus: 1 Magneetswitch: 1
LDR waarde: 0 Luikstatus: 1 Magneetswitch: 1
LDR waarde: 0 Luikstatus: 1 Magneetswitch: 1

Het veranderd dus naar luikstatus 1. In de software staat dat het luik dan open is, maar het lijkt mij dat de luik dan dicht gaat omdat de LDR waarde onder de 36 gaat en dan de motor dan die 94 seconden naar beneden gaat.

Als ik de sensor weer in het licht zet met magneetswitch op 1 dan gebeurd er niks, dat is ook wel logisch want in de software staat dat de luik dan bovenaan is. Als ik dus de draden aan elkaar maak dan wordt de magneetwaarde 0 en als de LDR waarde dan boven die 290 komt dan gaat de luik weer open en komt de luikstatus op 0 te staan.

Als ik dan de draden weer van elkaar af haal dan stopt de motor omdat de magneetswitch op 1 komt te staan.

De software lijkt het te doen alleen de magneetswitch is nog een probleem. Ik ga even kijken waar dat aan kan liggen (begin maar met doormeten :-).

Maar heeft iemand nog een idee waarom de luikstatus 1 wordt als ik de luik in het donker zet? De luik gaat dan wel gewoon dicht.

buckfast_beekeeper

Golden Member

Zodra het luik zakt, dien je de draden uit elkaar te halen. Het luik verlaat namelijk zijn eindstand en zal dalen gedurende 100 seconden.

c code:

int LuikPulsen = 100; 

en

c code:

/*************************/
void SluitLuik(void) {
  /*************************/
  digitalWrite(motortin1Pin, LOW);
  digitalWrite(motortin2Pin, HIGH);
  for (int teller = 0; teller < LuikPulsen; teller++) delay(1000);
  // motor uit
  digitalWrite(motortin1Pin, LOW);
  digitalWrite(motortin2Pin, LOW);
}

Mooier is te werken met 2 sensoren. 1 boven en 1 beneden. Dan kan je nog een timer gebruiken om te beveiligen als de schuif mocht blokeren.

Van Lambiek wordt goede geuze gemaakt.

Ik heb net de magneet switch doorgemeten, gewoon de contacten van beide draden van de magneet aangesloten op de meter. Als ik de meter op 200 ohm zet dan komt er 00.7 in de meter te staan. Maar als ik de magneet er tegen aan houdt dan gebeurd er helemaal niks. Die 00.7 blijft gewoon in het schermpje staan van de meter....

Werken de magneten dan wel?

buckfast_beekeeper

Golden Member

Dat een magneet 'werkt' kan je perfect controleren. Hang ze even aan een hamer. Blijven ze niet hangen, magneet gedemagnetiseerd. Ik denk eerder aan een kapotte sensor.

Van Lambiek wordt goede geuze gemaakt.

Bedankt voor de reactie.

De magneten werken wel want er blijft ook een ledlampje aan hangen :-).

Als de waarde gewoon rond die 00.7 blijft en er verder niks gebeurd als ik beide magneten bij elkaar houd kan ik er dan vanuit gaan dat de sensor in de magneet switch kapot is?

Moet de sensor gesloten zijn met of zonder magnetisme? Jij meet 0 Ohm zonder magneet, maar is dat correct? Wij hebben geen gegevens over de sensor, jij wel als het goed is.

"We cannot solve our problems with the same thinking we used when we created them" - Albert Einstein

Phoe ik heb geen idee. Ik begreep uit het verhaal dat je de sensor van de magneet gewoon kan meten. En dat er verschillende waarden moeten komen als je de magneet erbij houd en er weer vanaf.

Bij mij veranderd die waarde niet. Als de magneet in contact komt met het andere magneetje dan moet de waarde 1 worden gekregen dus ik denk dat dan de sensor gesloten moet zijn?

De gegevens van de sensoren zijn:

Specificaties:
Materiaal: ABS
Afmetingen ca. 27 x 14 x 8(mm)
Shakeling: N/O normally open
Voltage: 100V DC
Schakelvermogen: 10W
Schakelafstand ca.: 15-25mm
Kabellengte ca. 350mm
Bevestiging: plakstrip en montagegaten(3mm) aanwezig.

Of zal ik verkeerde magneetsensors besteld hebben? Het moet een maak contact zijn, kan daar ook nog verschil in zitten?