studieproject

Arduino specifieke Software
Berichten: 12
Geregistreerd: 30 Jan 2017, 17:46

studieproject

Berichtdoor Carlijn » 30 Jan 2017, 18:07

Hoi allemaal,
Ik ben me vandaag aangemeld omdat ik voor mijn studie Arduino nodig heb.
Persoonlijk heb ik totaal geen ervaring met dit soort software en ben ik ook niet erg handig met computers

Jullie zullen wel denken wat moet die nu hier.
Nou ik vroeg me af of er iemand was die het leuk vind om mij te helpen het te maken zodat het allemaal werkt.

Na me wat verdiept te hebben in de basis begrijp ik het geloof ik een beetje, maar helaas doet het niet wat ik wil.


Mijn apparaat moet het volgende doen:
-elke druk op een knop moet geregistreerd worden.
- wanneer een bepaald aantal keer gedrukt word, klinkt er een toon, en draait er met behulp van een motor een wiel draait een stap waardoor er een beloning boven een gat valt.
-er moet een vertraging worden ingebouwd wanneer de toon klinkt, zodat extra drukken op dat moment niet geregistreerd worden.

Wie vind het leuk en kan mijn hiermee helpen?

Als er iemand is die dat kan, zal ik de code die ik tot nu toe heb toevoegen.

Advertisement

Gebruikers-avatar
Berichten: 2655
Geregistreerd: 06 Aug 2016, 01:03

Re: studieproject

Berichtdoor Koepel » 30 Jan 2017, 19:30

Laat maar zien wat je hebt.
Wanneer je "code tags" gebruikt, dan is het beter te lezen. Met de knop "Code" krijg je [ code ] en [ /code ], en daar binnen de sketch plaatsen. Je kunt ook het drop-down-menu "Select a Syntax" gebruiken, en dan "C++".
Kun je ook vertellen hoe de hardware is ? Welk Arduino board gebruik je ? Hoe stuur je de motor aan ? Hoe zijn de luidspreker en knoppen aangesloten, enzovoorts.

Berichten: 4067
Geregistreerd: 16 Okt 2013, 14:31
Woonplaats: s hertogenbosch

Re: studieproject

Berichtdoor shooter » 30 Jan 2017, 22:22

maak als eerste maar eens een drukknop , gebruik dan input_pullup en doe de schakelaar naar gnd.
als de knop in is (dat is dus LOW) zet dan de led aan (outputpin 13)
als dat werkt zet er dan een teller bij

als die werkt (kun je testen met serial.print en de monitor) zet dan een speakertje erbij en een weerstandje want anders word de stroom te groot.
bedien die eerst maar eens met tone.
download en print een cheatsheet, dat is handig om er naast te leggen.
en gewoon lekker proberen, maar hou je doel in de gaten, want er is natuurlijk wel tijdsdruk door de leraar,.
welke opleiding en waar doe je deze.
paul deelen
shooter@home.nl

Berichten: 12
Geregistreerd: 30 Jan 2017, 17:46

Re: studieproject

Berichtdoor Carlijn » 31 Jan 2017, 09:39

cpp code
// STEPPER included to give reward automatically.
// (can be downloaded at: http://www.airspayce.com/mikem/arduino/ ... pper/)
#include <AccelStepper.h>

//Define the stepper motor and the connection between Arduino Uno and the motor driver boards:
//pin 1 indicates that the stepper motor 1 is driven by a driver board, pin 2 is connected to "step"of the driver board, pin 3 is connected to "direction"of the driver board.
AccelStepper stepper(1, 2, 3);

//define the rotation angle of the feed dispensing disk
//This is the disk rotation angle in the stepper motor in microsteps: a disk contains 50 holes and the used stepper motors divide one full circle in 1600 microsteps, meaning that there is a hole aver 32 microsteps (1600/50=32):
#define rotationAngleDisk 32

//This is the amount of microsteps a stepper motor will repeatedly move forward when its calibration button is held down:
#define calibrationAngleDisk 3

//This is the amount of presses needed in order to receive a food reward when pressing
#define neededPressesButton 1

//This is the time in milliseconds during which the program will pause after a reward has been received
#define pauseTimeAfterReward 2500

//This is the extra amount of presses needed for a new reward
#define extraPressesNeeded 2




// Constants won't change. They're used here to set pin numbers, to define to which Arduino Uno pins are connected:
int buttonPin = 4; //Button is connected to Arduino pin 4
int calibrationPin = 5; //Calibration button is connected to Arduino pin 5
const int pauseButtonCountReward = 500; //This is the amount of time button presses are not counted after the reward has been given, to prevent accidental presses for the next reward when consuming.

// Variables will change:
int rewardCounter = 0; //Counts the amount of rewards received at pedal
int totalPress = 0; //Counts the total amount of presses without a reward being received because the timeAfterReward was still running
int totalLastPress = 0; //Counts the amount of presses after a reward being received because the timeAfterReward was still running
int pressesForReward = extraPressesNeeded * rewardCounter - 1; //Counts the amount of presses needed for the next reward

// The following variables are unsigned long's because the time, measured in milliseconds, will quickly become a bigger number than can be stored in an int
unsigned long totalTime = 0; //This is the total amount has passed after (initial value is zero)
unsigned long timeAfterReward = 0; //This is the amount of time that has passed after a reward is received (initial value is zero)


boolean lastButtonState = LOW;

// When using a hardware switch you may want to debounce the input so that you don't multiple trigger on a noisy edge transition.
//Function for removing the debounce effect of button 1:
boolean debounce(boolean last)
{
boolean current = digitalRead(buttonPin);
if (last != current)
{
delay(5);
current = digitalRead(buttonPin);
}
return current;
}

void setup() {
// put your setup code here, to run once. It is used to initialize variables, pin modes, start using libraries, etc.

pinMode(buttonPin, INPUT); //Sets button as an input signal to the Arduino
pinMode(calibrationPin, INPUT); //Sets calibration button as an input signal to the Arduino

Serial.begin(9600); //Initializes serial communication, 9600bits per second

} //close setup

//The loop functions loops consecutively, allowing the program to change and respond, it is used to actively control the Ardino board:
void loop() { // put your main code here, to run repeatedly:

//The code below results in output text in the serial monitor:
Serial.print("Amount of presses needed for food reward: ");
Serial.print(neededPressesButton);

//Variable indicating the current state of button (the debounce function is used here)
boolean currentButtonState = debounce(lastButtonState);

//If the defined amount of pause time after a reward has not passed yet AND timeAfterReward is not equal to zero (because timeAfterReward is zero at the start of the program)
//It pauses the program after every reward (during the amount of milliseconds set at the top of the program code:pauseTimeAfterReward
if (millis() - timeAfterReward <= pauseTimeAfterReward && timeAfterReward != 0)
{
//nothing should happen here, it pauses the program after everey reward (during the amount of milliseconds set at the top of the program code:pauseTimeAfterReward
if (currentButtonState != lastButtonState && millis() - timeAfterReward < pauseButtonCountReward)
{
if (currentButtonState == HIGH)
{
}
}
else
{
if (currentButtonState != lastButtonState) // if the current state of the button is not equel to the last ste of the butoon (pressed or released)
{
if (currentButtonState == HIGH) // pedal is pressed when current button state is high
{

totalPress++; // totalPress will increase with 1 unit;
totalLastPress++; // TotalLastPress wil increase with 1 unit: amount of presses after a reward.


}
}

if (totalLastPress == pressesForReward) // if totalLastPress (totalamount of presses after last reward) is equal to amount of presses needed for reward, a reward is given
{
stepper.setMaxSpeed(3000); //maximum speed of stepper (in microsteps/s)
stepper.setAcceleration(3000); //acceleration of stepper (in microsteps/s)
stepper.moveTo(stepper.currentPosition() + calibrationAngleDisk); //stepper will move forward to amount of steps defined in calibrationAngleDisk
tone(12, 16000, 100); // the speaker( connected to Arduino pin 12) produces a 1600Hz sound during 100,s (0.1s), cats know a reward wil come.
totalLastPress = 0; // TotalLastPress is set to zero after a reward is given; meaning that counting starts over again.
rewardCounter++; // rewardCounter will increase with 1 unit

//the following information is printed
Serial.println("total time: ");
Serial.print(totalTime);
Serial.print(" ms, ");

Serial.print("\t"); // printing a tab
Serial.print("Pedal is pressed at milliseconds after last reward: ");
Serial.print(timeAfterReward);
Serial.print(" ms, ");

Serial.print("\t"); // printing a tab
Serial.print("resulting in food reward number: ");
Serial.print(rewardCounter);

Serial.print("\t"); // printing a tab
Serial.print("Total number of presses is: ");
Serial.print(totalPress);

timeAfterReward = 0; //timeAfterReward is set to zero after a reward is given.

}

else // if the amount of presses at the pedal is lower that the amount of presses needed for receiving a reward.
{
if (totalLastPress != pressesForReward)// if totalLastPress (totalamount of presses after last reward is not equal to amount of presses needed for reward)
{

}
}
}

lastButtonState = currentButtonState; // at the end of every loop the last state of the button is set equal to the current state of the button
stepper.run(); //causes stepper motor to run, this command has to be called as frequently as possible and is therefor found in the main loop

}
}

Berichten: 12
Geregistreerd: 30 Jan 2017, 17:46

Re: studieproject

Berichtdoor Carlijn » 31 Jan 2017, 09:42

Het misschien stapsgewijs opbouwen is wel een idee!
Daar kan ik vanmiddag wel naar kijken.

Ik ben bezig met mijn afstudeer onderzoek bij de wageningen universiteit. Dit heb ik nodig om gegevens te krijgen over voer inname.

Ik moet even kijken wat voor een board en speaker het zijn, het is een opstelling van iemand anders die ik aanpas naar mijn wensen. (als dat ooit gaat lukken)


Ik heb bij de code proberen bij te zetten wat er gebeurt om het voor mijn zelf helder te krijgen. (sorry was al in het engels)
Maar ik heb dus nog nooit met iets van arduino gewerkt, en dat maakt het erg lastig.

Berichten: 12
Geregistreerd: 30 Jan 2017, 17:46

Re: studieproject

Berichtdoor Carlijn » 31 Jan 2017, 09:50

Koepel schreef:Laat maar zien wat je hebt.
Wanneer je "code tags" gebruikt, dan is het beter te lezen. Met de knop "Code" krijg je [ code ] en [ /code ], en daar binnen de sketch plaatsen. Je kunt ook het drop-down-menu "Select a Syntax" gebruiken, en dan "C++".
Kun je ook vertellen hoe de hardware is ? Welk Arduino board gebruik je ? Hoe stuur je de motor aan ? Hoe zijn de luidspreker en knoppen aangesloten, enzovoorts.



Ik ga vanmiddag even kijken welk board enzo het is.
Grote kans dat daar ook een fout met aansluiten in zit aangezien ik dat heb moeten aanpassen vanaf de vorige opstelling.

Gebruikers-avatar
Berichten: 2655
Geregistreerd: 06 Aug 2016, 01:03

Re: studieproject

Berichtdoor Koepel » 31 Jan 2017, 10:18

Dat ik de hardware wil weten is om te kijken dat de Arduino niet meteen doorbrand. Als het goed is, heeft iemand daar een schema van gemaakt, anders is het nodig dat je zelf iets tekent.
shooter heeft dezelfde bedenkingen. Als je bijvoorbeeld een 8 ohm speakertje meteen op een pin aansluit, dan kan de Arduino raar gaan doen, en dat kunnen wij moeilijk vinden door alleen naar de code te kijken.

Je hebt de "code-tags" gevonden :D

De code is niet heel slecht, maar als ik er doorheen scroll dan vallen mij allerlei dingen op.
Ten eerste lijkt het te ingewikkeld. Er zijn volgens mij teveel variabelen om te tellen.

Ik zal er doorheen lopen, kijk maar of je iets aan mijn opmerkingen hebt.

1 ) Gebruik van AccelStepper is goed.
2 ) Gebruik van pin 1 is niet zo goed. Bij een Arduino Uno zitten de seriële poort op pin 0 en pin 1. Het hangt er dus maar van af welk Arduino board je gebruikt.
3 ) De variabelen met millis() zoals "totalTime" en "timeAfterReward" zijn unsigned long. Dat is heel goed.
4 ) De functie "debounce()" is eenvoudig, maar ik vind het prima. Een klein beetje debouncen is beter dan niets. Maar als het mogelijk is, stop dan ook de volledige debounce in een functie. Je zou een functie kunnen maken met een pin nummer als parameter die een gedebouncte waarde terug geeft ("gedebouncte" zal geen nederlands zijn). Nu is het een beetje hier en een beetje daar, en dat is voor mij moeilijk te begrijpen.
5 ) De variabele "lastButtonState" en het gebruik daarvan vind ik onduidelijk. En als ik het onduidelijk vind, dan is de kans groot dat het niet klopt :geek:
6 ) Kijken of "timeAfterReward != 0" is niet correct. Als je wilt dat iets de eerste keer niet wordt uitgevoerd, gebruik dan een variabele die dat bijhoudt.
7 ) Je maakt "timeAfterReward != 0" nul. Dat kan niet. Het is een variabele die met millis() te maken heeft, en dan kun je niet vanaf nul gaan tellen. Het juiste gebruik van millis() kan maar op een paar manieren.
8 ) De StateChangeDetection (met lastButtonState) zit verweven met millis(). Als je dat kunt scheiden dan is het gemakkelijker na te gaan wat er gebeurt.
9 ) Om de overgang te maken van de beschrijving naar de sketch, kun je een tekening maken met de verschillende onderdelen. Vervolgens kun je die onderdelen gaan opsplitsen in kleinere delen en dat gaan uitwerken in code. Een andere optie is een beschrijving te maken die een indeling maakt naar functionaliteit. Vanuit een beschrijving direct code gaan schrijven zorgt niet voor overzichtelijke code.

Berichten: 12
Geregistreerd: 30 Jan 2017, 17:46

Re: studieproject

Berichtdoor Carlijn » 31 Jan 2017, 11:26

Bedankt voor deze info vast.
Ik ben erg blij met alle aanwijzingen, voor en leek is het erg vaag :P
Ik ga er vanmiddag weer even een middagje aan zitten bij de opstelling.

Denk inderdaad dat er iets niet klopt met het drukken op de knop.
Gisteren bleef hij constant registreren dat er gedrukt werd, terwijl de knop niet werd aangeraakt.

Berichten: 12
Geregistreerd: 30 Jan 2017, 17:46

Re: studieproject

Berichtdoor Carlijn » 31 Jan 2017, 14:42

Ik heb een arduino uno met een easy driver motor die aangesloten is op een 12 v adapter.

Ik denk dat de bedrading inderdaad niet goed zit. Nu probeer ik dat via youtube en webpages goed te zetten. Helaas nog zonder succes helaas.

Berichten: 12
Geregistreerd: 30 Jan 2017, 17:46

Re: studieproject

Berichtdoor Carlijn » 31 Jan 2017, 16:29

naar middag puzzelen:

-de motor draait constant, dus niet alleen een stap voorwaarts
- hij denkt dat ik de hele tijd op de knop druk, dus blijft data schrijven
-komt geen geluid uit de speaker
-reward schema klopt nog niet

ben gelukkig al verder dat er wat werkt, maar nu weet ik niet hoe ik verder zal moeten
ik heb mijn schema uitgetekend, misschien helpt dat wat

Reward schema zou moeten zijn: een keer drukken is een beloning (dus motor moet draaien een stap),daarna 3x drukken, 5x drukken, 7x drukken enzovoort voor een beloning.


Wie zou mee willen kijken zodat het gaat werken?
Ik vind het erg interessant maar heb nu geen tijd om alles tot in de details uit te zoeken, en heb het eigenlijk ook helemaal niet nodig voor mijn opleiding. Maar voor dit proefje is het nodig :(
Bijlagen
arduino sketch.JPG
sketch
arduino sketch.JPG (68.88 KiB) 8766 keer bekeken

Volgende

Terug naar Arduino software

Wie is er online?

Gebruikers in dit forum: Geen geregistreerde gebruikers en 18 gasten