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
/*
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();
}
kloppertje
Diverse projecten en experimenten: www.elexperiment.nl
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.
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?
flipflop
"We cannot solve our problems with the same thinking we used when we created them" - Albert Einstein
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.
Ik doe altijd
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:
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.
kloppertje
Diverse projecten en experimenten: www.elexperiment.nl
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).
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.
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?
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%)]
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.
flipflop
"We cannot solve our problems with the same thinking we used when we created them" - Albert Einstein
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?
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?
flipflop
"We cannot solve our problems with the same thinking we used when we created them" - Albert Einstein
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.
buckfast_beekeeper
Van Lambiek wordt goede geuze gemaakt.
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
pinMode(magneetPin, INPUT_PULLUP);
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
flipflop
"We cannot solve our problems with the same thinking we used when we created them" - Albert Einstein
Knap denkwerk
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.
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
Van Lambiek wordt goede geuze gemaakt.
Zodra het luik zakt, dien je de draden uit elkaar te halen. Het luik verlaat namelijk zijn eindstand en zal dalen gedurende 100 seconden.
int LuikPulsen = 100;
en
/*************************/
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.
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
Van Lambiek wordt goede geuze gemaakt.
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.
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?
flipflop
"We cannot solve our problems with the same thinking we used when we created them" - Albert Einstein
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.
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?