waarom stopt gaat mijn programma niet naar de volgende stap?
4 berichten
• Pagina 1 van 1
- alfredgeel
- Berichten: 1
- Geregistreerd: 31 Mei 2023, 15:18
waarom stopt gaat mijn programma niet naar de volgende stap?
Hallo allemaal,
Ik ben zesdejaarsstudent IW en ik heb voor mijn GIP een tiktak huis gemaakt.
Op zich lijkt het een eenvoudige opdracht maar ik heb er al veel uit geleerd dat niet alles zo simpel is als het lijkt.
ik heb dan ook al heel veel gehad aan dit forum.
Alle onderdelen, zoals het openen van de deuren, het draaien van de schijf, het tikken van de klok en het opkomen van de maan/zon werken.
Maar op één punt loop ik vast en ik krijg het niet direct opgelost:
Een IR sensor detecteert een gat in de schijf. Vanaf dat moment stopt de schijf met draaien en moeten de deuren dicht gaan en moet de klok stoppen.
Deze stap, tussen het stoppen van de schijf en de volgende stap, werkt niet.
via de seriële monitor kan ik zien dat stap ( case7) niet bereikt wordt.
is er iemand die mijn sketch wil nakijken en me tips kan geven ?
#include <Servo.h>
#include <AccelStepper.h>
//sensor
const int obstacleSensorPin = 5;
//button
int buttonPin = 26;
int buttonState = 0;
//maan
Servo maan;
int pos = 0;
unsigned long previousMillis = 0;
unsigned long interval = 8000;
//deuren
Servo rechts;
Servo links;
//stappanmotor
const int dirPin = 8;
const int stepPin = 9;
bool motor_Pulse = false;
int motorSpeed = 10; //2X tijd tussen steps 1 true en 1 false .. 10*5ms = 50steps/sec
unsigned long motor_LastUpdate;
volatile bool motorEnabled = false;
//klok
Servo myservo;
int servo_Pos = 0;
volatile bool servo_SwipingEnabled = false; //Keyword Volatile nodig voor alle variabelen die veranderen en gebruikt worden in main-Interrupt ISR
bool servo_SwipingRight = true;
const byte servo_StepSize = 1;
const byte servo_Pin = 3;
const byte servo_min = 0;
const byte servo_max = 90;
const byte servo_pause = 45;
//fsm
int currentStep = 0;
void setup() {
Serial.begin(9600);
//sensor
pinMode(obstacleSensorPin, INPUT);
//button
pinMode(buttonPin, INPUT);
//maan
maan.attach(7);
maan.write(0);
//deuren
rechts.attach(4);
links.attach(6);
rechts.write(90);
links.write(0);
//stappenmotor
volatile bool motorEnabled = false;
pinMode(dirPin, OUTPUT);
pinMode(stepPin, OUTPUT);
digitalWrite(dirPin, false); //Set direction of stepper
//klok
myservo.attach(servo_Pin);
servo_Pos = servo_pause;
myservo.write(servo_Pos);
cli();
//Timer2 (interrupt each 8.128 ms)
// interrupt time = 1/(16Mhz/1024) * 127 = 8.128ms;
TCCR2A = 0; // Reset entire TCCR1A to 0
TCCR2B = 0; // Reset entire TCCR1B to 0
TCCR2B |= B00000111; //Set CS20, CS21 and CS22 to 1 so we get prescalar 1024
TIMSK2 |= B00000100; //Set OCIE1B to 1 so we enable compare match B
OCR2B = 127; //Finally we set compare register B to this value
sei(); //Enable back the interrupts
motor_LastUpdate = millis(); //Init lastUpdate times
}
void loop() {
// put your main code here, to run repeatedly:
//button
buttonState = digitalRead(buttonPin);
//sensor
//fsm
switch (currentStep) {
case 0: //Start: wacht op drukknop
Serial.println("In case 0");
if (buttonState == true) {
currentStep++;
}
break;
case 1: // de slinger start met slagen
Serial.println("In case 1");
servo_SwipingEnabled = true;
delay(5000);
currentStep++;
break;
case 2: // maan komt op en de zon gaat onder
Serial.println("In case 2");
for (int maanPos = 0; maanPos <= 90; maanPos += 1) { // Servo draait naar 90 graden
maan.write(maanPos); // Servo positie bijwerken
delay(88); // Vertraging van 88 ms voor 18900 graden in 8 seconden
}
currentStep++;
break;
case 3: //deuren open
Serial.println("In case 3");
delay(1000);
rechts.write(0);
links.write(90);
currentStep++;
break;
case 4: //motor start met draaien
Serial.println("In case 4");
motorEnabled = true;
currentStep++;
break;
case 5: //delay voor het vermijden van het gat
Serial.println("In case 5");
delay(2000);
currentStep++;
break;
case 6: // sensor detecteert een gat
Serial.println("In Step 6");
int sensorValue = digitalRead(obstacleSensorPin);
if (sensorValue == true) { // IR-sensor detecteert geen obstakel
Serial.println("Sensor heeft gat gespot");
motorEnabled = false; // Motor stoppen
currentStep++; // Ga naar de volgende stap
}
break;
case 7: //deuren dicht
Serial.println("In case 7");
delay(1000);
rechts.write(90);
links.write(0);
currentStep++;
break;
case 8: //maan gaat onder
Serial.println("In case 8");
delay(1000); //maan naar startpositie
for (int posMaan = 90; posMaan >= 0; posMaan -= 1) { // Servo draait naar 0 graden
maan.write(posMaan); // Servo positie bijwerken
delay(88);
} // Vertraging van 44 ms voor 180 graden in 8 seconden
currentStep++;
break;
case 9: //slinger stopt
Serial.println("In case 9");
delay(1000);
servo_SwipingEnabled = false;
currentStep++;
break;
case 10: // terug naar het begin
Serial.println("In case 10");
buttonState = false;
currentStep = 0;
break;
default:
// if nothing else matches, do the default
// default is optional
break;
}
}
ISR(TIMER2_COMPB_vect) {
Timer_Tick();
}
void Timer_Tick() {
Klok_Update();
Draaischijf_update();
}
void Klok_Update() {
if ((servo_SwipingEnabled == true) || (servo_Pos != servo_pause)) {
if (servo_SwipingRight == true) {
servo_Pos += servo_StepSize;
if (servo_Pos > servo_max) {
servo_Pos = servo_max;
servo_SwipingRight = false;
}
} else {
servo_Pos -= servo_StepSize;
if (servo_Pos < servo_min) {
servo_Pos = servo_min;
servo_SwipingRight = true;
}
}
myservo.write(servo_Pos);
}
}
void Draaischijf_update() {
unsigned long currentMillis = millis();
if (currentMillis - motor_LastUpdate >= motorSpeed) { //If elapsed time > interval
if (motorEnabled == true) { //If enabled => Toggle pulse-output
if (motor_Pulse == true) {
motor_Pulse = false;
} else {
motor_Pulse = true;
}
digitalWrite(stepPin, motor_Pulse);
} else { //If not enabled => Always false
digitalWrite(stepPin, false);
}
motor_LastUpdate = millis();
}
}
Ik ben zesdejaarsstudent IW en ik heb voor mijn GIP een tiktak huis gemaakt.
Op zich lijkt het een eenvoudige opdracht maar ik heb er al veel uit geleerd dat niet alles zo simpel is als het lijkt.
ik heb dan ook al heel veel gehad aan dit forum.
Alle onderdelen, zoals het openen van de deuren, het draaien van de schijf, het tikken van de klok en het opkomen van de maan/zon werken.
Maar op één punt loop ik vast en ik krijg het niet direct opgelost:
Een IR sensor detecteert een gat in de schijf. Vanaf dat moment stopt de schijf met draaien en moeten de deuren dicht gaan en moet de klok stoppen.
Deze stap, tussen het stoppen van de schijf en de volgende stap, werkt niet.
via de seriële monitor kan ik zien dat stap ( case7) niet bereikt wordt.
is er iemand die mijn sketch wil nakijken en me tips kan geven ?
#include <Servo.h>
#include <AccelStepper.h>
//sensor
const int obstacleSensorPin = 5;
//button
int buttonPin = 26;
int buttonState = 0;
//maan
Servo maan;
int pos = 0;
unsigned long previousMillis = 0;
unsigned long interval = 8000;
//deuren
Servo rechts;
Servo links;
//stappanmotor
const int dirPin = 8;
const int stepPin = 9;
bool motor_Pulse = false;
int motorSpeed = 10; //2X tijd tussen steps 1 true en 1 false .. 10*5ms = 50steps/sec
unsigned long motor_LastUpdate;
volatile bool motorEnabled = false;
//klok
Servo myservo;
int servo_Pos = 0;
volatile bool servo_SwipingEnabled = false; //Keyword Volatile nodig voor alle variabelen die veranderen en gebruikt worden in main-Interrupt ISR
bool servo_SwipingRight = true;
const byte servo_StepSize = 1;
const byte servo_Pin = 3;
const byte servo_min = 0;
const byte servo_max = 90;
const byte servo_pause = 45;
//fsm
int currentStep = 0;
void setup() {
Serial.begin(9600);
//sensor
pinMode(obstacleSensorPin, INPUT);
//button
pinMode(buttonPin, INPUT);
//maan
maan.attach(7);
maan.write(0);
//deuren
rechts.attach(4);
links.attach(6);
rechts.write(90);
links.write(0);
//stappenmotor
volatile bool motorEnabled = false;
pinMode(dirPin, OUTPUT);
pinMode(stepPin, OUTPUT);
digitalWrite(dirPin, false); //Set direction of stepper
//klok
myservo.attach(servo_Pin);
servo_Pos = servo_pause;
myservo.write(servo_Pos);
cli();
//Timer2 (interrupt each 8.128 ms)
// interrupt time = 1/(16Mhz/1024) * 127 = 8.128ms;
TCCR2A = 0; // Reset entire TCCR1A to 0
TCCR2B = 0; // Reset entire TCCR1B to 0
TCCR2B |= B00000111; //Set CS20, CS21 and CS22 to 1 so we get prescalar 1024
TIMSK2 |= B00000100; //Set OCIE1B to 1 so we enable compare match B
OCR2B = 127; //Finally we set compare register B to this value
sei(); //Enable back the interrupts
motor_LastUpdate = millis(); //Init lastUpdate times
}
void loop() {
// put your main code here, to run repeatedly:
//button
buttonState = digitalRead(buttonPin);
//sensor
//fsm
switch (currentStep) {
case 0: //Start: wacht op drukknop
Serial.println("In case 0");
if (buttonState == true) {
currentStep++;
}
break;
case 1: // de slinger start met slagen
Serial.println("In case 1");
servo_SwipingEnabled = true;
delay(5000);
currentStep++;
break;
case 2: // maan komt op en de zon gaat onder
Serial.println("In case 2");
for (int maanPos = 0; maanPos <= 90; maanPos += 1) { // Servo draait naar 90 graden
maan.write(maanPos); // Servo positie bijwerken
delay(88); // Vertraging van 88 ms voor 18900 graden in 8 seconden
}
currentStep++;
break;
case 3: //deuren open
Serial.println("In case 3");
delay(1000);
rechts.write(0);
links.write(90);
currentStep++;
break;
case 4: //motor start met draaien
Serial.println("In case 4");
motorEnabled = true;
currentStep++;
break;
case 5: //delay voor het vermijden van het gat
Serial.println("In case 5");
delay(2000);
currentStep++;
break;
case 6: // sensor detecteert een gat
Serial.println("In Step 6");
int sensorValue = digitalRead(obstacleSensorPin);
if (sensorValue == true) { // IR-sensor detecteert geen obstakel
Serial.println("Sensor heeft gat gespot");
motorEnabled = false; // Motor stoppen
currentStep++; // Ga naar de volgende stap
}
break;
case 7: //deuren dicht
Serial.println("In case 7");
delay(1000);
rechts.write(90);
links.write(0);
currentStep++;
break;
case 8: //maan gaat onder
Serial.println("In case 8");
delay(1000); //maan naar startpositie
for (int posMaan = 90; posMaan >= 0; posMaan -= 1) { // Servo draait naar 0 graden
maan.write(posMaan); // Servo positie bijwerken
delay(88);
} // Vertraging van 44 ms voor 180 graden in 8 seconden
currentStep++;
break;
case 9: //slinger stopt
Serial.println("In case 9");
delay(1000);
servo_SwipingEnabled = false;
currentStep++;
break;
case 10: // terug naar het begin
Serial.println("In case 10");
buttonState = false;
currentStep = 0;
break;
default:
// if nothing else matches, do the default
// default is optional
break;
}
}
ISR(TIMER2_COMPB_vect) {
Timer_Tick();
}
void Timer_Tick() {
Klok_Update();
Draaischijf_update();
}
void Klok_Update() {
if ((servo_SwipingEnabled == true) || (servo_Pos != servo_pause)) {
if (servo_SwipingRight == true) {
servo_Pos += servo_StepSize;
if (servo_Pos > servo_max) {
servo_Pos = servo_max;
servo_SwipingRight = false;
}
} else {
servo_Pos -= servo_StepSize;
if (servo_Pos < servo_min) {
servo_Pos = servo_min;
servo_SwipingRight = true;
}
}
myservo.write(servo_Pos);
}
}
void Draaischijf_update() {
unsigned long currentMillis = millis();
if (currentMillis - motor_LastUpdate >= motorSpeed) { //If elapsed time > interval
if (motorEnabled == true) { //If enabled => Toggle pulse-output
if (motor_Pulse == true) {
motor_Pulse = false;
} else {
motor_Pulse = true;
}
digitalWrite(stepPin, motor_Pulse);
} else { //If not enabled => Always false
digitalWrite(stepPin, false);
}
motor_LastUpdate = millis();
}
}
Advertisement
Re: waarom stopt gaat mijn programma niet naar de volgende s
start case 5 als de sensor NIET op het gat en kijk wat er dan gebeurt je opzet is prima en zou moeten werken eventueel kun je de LED(13) gebruiken om te zien of je sensor werkt.
paul deelen
shooter@home.nl
shooter@home.nl
Re: waarom stopt gaat mijn programma niet naar de volgende s
Met je opmerking dat case 7 niet wordt gestart zou ik naar case 6 kijken of die goed is.
Als ik naar het programma kijk is dan de volgend statement verdacht. (true is stijdig met geen obstakel)
if (sensorValue == true) { // IR-sensor detecteert geen obstakel
kan misschien de oplossing zijn: if (sensorValue == false) { // IR-sensor detecteert geen obstakel
Als ik naar het programma kijk is dan de volgend statement verdacht. (true is stijdig met geen obstakel)
if (sensorValue == true) { // IR-sensor detecteert geen obstakel
kan misschien de oplossing zijn: if (sensorValue == false) { // IR-sensor detecteert geen obstakel
Re: waarom stopt gaat mijn programma niet naar de volgende s
ik zie dat het probleem
int sensorValue = digitalRead(obstacleSensorPin);
if (je maakt er een integer van en je vraagt een bool
sensorValue == true) { // IR-sensor detecteert geen obstakel
als je van die int een bool maakt dan gaat het wel door
int sensorValue = digitalRead(obstacleSensorPin);
if (je maakt er een integer van en je vraagt een bool
sensorValue == true) { // IR-sensor detecteert geen obstakel
als je van die int een bool maakt dan gaat het wel door
paul deelen
shooter@home.nl
shooter@home.nl
4 berichten
• Pagina 1 van 1
Terug naar Gezamenlijke projecten
Wie is er online?
Gebruikers in dit forum: Geen geregistreerde gebruikers en 32 gasten