19-08-2024, 22:40
Cześć,
Stworzyłem swój pierwszy, pewnie banalny, projekt i chciałbym go trochę ulepszyć.
Czujnik wizyjny Mu Vision Sensor ma zadanie zapalić zieloną diodę, gdy wykryje zdefiniowany kształt, i czerwoną diodę, gdy kształt, który się nie zgadza. I to fajnie działa.
Projekt banalny, bo w większości w kodzie jest biblioteka producenta, a moje dodatki to tylko pierwsze rzeczy z kursów, jak zapalanie diod...
Natomiast, niestety w tej chwili czujnik działa w ten sposób, że zaraz po starcie programu zaczyna triggerować i kończy po jakimś czasie. Ten czas zawsze jest różny i nie wiem od czego to zależy.
Ulepszenie polegałoby na tym, by czujnik nie triggerował od razu po uploadzie, ale tylko po naciśnięciu przycisku i się zatrzymywał po wyniku OK/NOK.
Niestety nie mam wiedzy, czy istnieje taka komenda, ani czy w ogóle to możliwe - czy producent przewidział taką możliwość.
Napisałem do DFRobot i dostałem taką zwrotkę "Yes we think so, as long as you set up the getValue() function to be called once after the button is pressed in your code."
Dodałem więc warunek if dla przycisku przed getvalue, ale nie osiągnąłem rezultatu. Przede wszystkim, po wciśnięciu przycisku czujnik nie triggerował raz, tylko wiele razy, tak jakby przycisk zwalniał resztę kodu, więc jakoś bym go musiał zatrzymać.
Poniżej działający kod, który tylko zaświeca diody, bez "ulepszeń".
Z góry dziękuję za pomoc.
#include <Arduino.h>
#include <DFRobot_MuVisionSensor.h>
#include <Wire.h>
#include <SoftwareSerial.h>
/*
* Choose communication mode define here:
* I2C_MODE : I2C mode, default pin: MU_SDA <==> ARDUINO_SDA, MU_SCL <==> ARDUINO_SCL
* SERIAL_MODE : Serial mode, default pin: MU_TX <==> ARDUINO_PIN3, MU_RX <==> ARDUINO_PIN2
*/
#define I2C_MODE
//#define SERIAL_MODE
/*
* Choose MU address here: 0x60, 0x61, 0x62, 0x63
* default address: 0x60
*/
#define MU_ADDRESS 0x60
#ifdef SERIAL_MODE
#define TX_PIN 2
#define RX_PIN 3
SoftwareSerial mySerial(RX_PIN, TX_PIN);
#endif
DFRobot_MuVisionSensor Mu(MU_ADDRESS);
void setup() {
// put your setup code here, to run once:
Serial.begin(9600);
pinMode(6, OUTPUT); // zielona
pinMode(9, OUTPUT); // czerwona
pinMode(7, INPUT_PULLUP); // przycisk
digitalWrite(6, LOW);
digitalWrite(9, LOW);
uint8_t err = MU_ERROR_FAIL;
#ifdef I2C_MODE
Wire.begin();
// initialized MU on the I2C port
err = Mu.begin(&Wire);
#elif defined SERIAL_MODE
mySerial.begin(9600);
// initialized MU on the soft serial port
err = Mu.begin(&mySerial);
#endif
if (err == MU_OK) {
Serial.println("MU initialized.");
} else {
do {
Serial.println("fail to initialize MU! Please check protocol "
"version or make sure MU is working on the "
"correct port with correct mode.");
delay(5000);
} while (1);
}
// enable vision: number card
Mu.visionBegin(VISION_SHAPE_CARD_DETECT);
}
void loop() {
// put your main code here, to run repeatedly:
long timeStart = millis();
// read result
if (Mu.getValue(VISION_SHAPE_CARD_DETECT, kStatus)) { // update vision result and get status, 0: undetected, other: detected
digitalWrite(6, HIGH);
digitalWrite(9, LOW);
Serial.println("vision shape card detected:");
Serial.print("x = ");
Serial.println(Mu.getValue(VISION_SHAPE_CARD_DETECT, kXValue)); // get vision result: x axes value
Serial.print("y = ");
Serial.println(Mu.getValue(VISION_SHAPE_CARD_DETECT, kYValue)); // get vision result: y axes value
Serial.print("width = ");
Serial.println(Mu.getValue(VISION_SHAPE_CARD_DETECT, kWidthValue)); // get vision result: width value
Serial.print("height = ");
Serial.println(Mu.getValue(VISION_SHAPE_CARD_DETECT, kHeightValue)); // get vision result: height value
Serial.print("label = ");
switch (Mu.getValue(VISION_SHAPE_CARD_DETECT, kLabel)) { // get vision result: label value
case MU_SHAPE_CARD_TICK:
Serial.println("tick");
break;
case MU_SHAPE_CARD_CROSS:
Serial.println("cross");
break;
case MU_SHAPE_CARD_CIRCLE:
Serial.println("circle");
break;
case MU_SHAPE_CARD_SQUARE:
Serial.println("square");
break;
case MU_SHAPE_CARD_TRIANGLE:
Serial.println("triangle");
break;
default:
Serial.print("unknow card type: ");
Serial.println(Mu.getValue(VISION_SHAPE_CARD_DETECT, kLabel));
break;
}
} else {
digitalWrite(6, LOW);
digitalWrite(9, HIGH);
Serial.println("vision shape card undetected.");
}
Serial.print("fps = ");
Serial.println(1000/(millis()-timeStart));
Serial.println();
}
Stworzyłem swój pierwszy, pewnie banalny, projekt i chciałbym go trochę ulepszyć.
Czujnik wizyjny Mu Vision Sensor ma zadanie zapalić zieloną diodę, gdy wykryje zdefiniowany kształt, i czerwoną diodę, gdy kształt, który się nie zgadza. I to fajnie działa.
Projekt banalny, bo w większości w kodzie jest biblioteka producenta, a moje dodatki to tylko pierwsze rzeczy z kursów, jak zapalanie diod...
Natomiast, niestety w tej chwili czujnik działa w ten sposób, że zaraz po starcie programu zaczyna triggerować i kończy po jakimś czasie. Ten czas zawsze jest różny i nie wiem od czego to zależy.
Ulepszenie polegałoby na tym, by czujnik nie triggerował od razu po uploadzie, ale tylko po naciśnięciu przycisku i się zatrzymywał po wyniku OK/NOK.
Niestety nie mam wiedzy, czy istnieje taka komenda, ani czy w ogóle to możliwe - czy producent przewidział taką możliwość.
Napisałem do DFRobot i dostałem taką zwrotkę "Yes we think so, as long as you set up the getValue() function to be called once after the button is pressed in your code."
Dodałem więc warunek if dla przycisku przed getvalue, ale nie osiągnąłem rezultatu. Przede wszystkim, po wciśnięciu przycisku czujnik nie triggerował raz, tylko wiele razy, tak jakby przycisk zwalniał resztę kodu, więc jakoś bym go musiał zatrzymać.
Poniżej działający kod, który tylko zaświeca diody, bez "ulepszeń".
Z góry dziękuję za pomoc.
#include <Arduino.h>
#include <DFRobot_MuVisionSensor.h>
#include <Wire.h>
#include <SoftwareSerial.h>
/*
* Choose communication mode define here:
* I2C_MODE : I2C mode, default pin: MU_SDA <==> ARDUINO_SDA, MU_SCL <==> ARDUINO_SCL
* SERIAL_MODE : Serial mode, default pin: MU_TX <==> ARDUINO_PIN3, MU_RX <==> ARDUINO_PIN2
*/
#define I2C_MODE
//#define SERIAL_MODE
/*
* Choose MU address here: 0x60, 0x61, 0x62, 0x63
* default address: 0x60
*/
#define MU_ADDRESS 0x60
#ifdef SERIAL_MODE
#define TX_PIN 2
#define RX_PIN 3
SoftwareSerial mySerial(RX_PIN, TX_PIN);
#endif
DFRobot_MuVisionSensor Mu(MU_ADDRESS);
void setup() {
// put your setup code here, to run once:
Serial.begin(9600);
pinMode(6, OUTPUT); // zielona
pinMode(9, OUTPUT); // czerwona
pinMode(7, INPUT_PULLUP); // przycisk
digitalWrite(6, LOW);
digitalWrite(9, LOW);
uint8_t err = MU_ERROR_FAIL;
#ifdef I2C_MODE
Wire.begin();
// initialized MU on the I2C port
err = Mu.begin(&Wire);
#elif defined SERIAL_MODE
mySerial.begin(9600);
// initialized MU on the soft serial port
err = Mu.begin(&mySerial);
#endif
if (err == MU_OK) {
Serial.println("MU initialized.");
} else {
do {
Serial.println("fail to initialize MU! Please check protocol "
"version or make sure MU is working on the "
"correct port with correct mode.");
delay(5000);
} while (1);
}
// enable vision: number card
Mu.visionBegin(VISION_SHAPE_CARD_DETECT);
}
void loop() {
// put your main code here, to run repeatedly:
long timeStart = millis();
// read result
if (Mu.getValue(VISION_SHAPE_CARD_DETECT, kStatus)) { // update vision result and get status, 0: undetected, other: detected
digitalWrite(6, HIGH);
digitalWrite(9, LOW);
Serial.println("vision shape card detected:");
Serial.print("x = ");
Serial.println(Mu.getValue(VISION_SHAPE_CARD_DETECT, kXValue)); // get vision result: x axes value
Serial.print("y = ");
Serial.println(Mu.getValue(VISION_SHAPE_CARD_DETECT, kYValue)); // get vision result: y axes value
Serial.print("width = ");
Serial.println(Mu.getValue(VISION_SHAPE_CARD_DETECT, kWidthValue)); // get vision result: width value
Serial.print("height = ");
Serial.println(Mu.getValue(VISION_SHAPE_CARD_DETECT, kHeightValue)); // get vision result: height value
Serial.print("label = ");
switch (Mu.getValue(VISION_SHAPE_CARD_DETECT, kLabel)) { // get vision result: label value
case MU_SHAPE_CARD_TICK:
Serial.println("tick");
break;
case MU_SHAPE_CARD_CROSS:
Serial.println("cross");
break;
case MU_SHAPE_CARD_CIRCLE:
Serial.println("circle");
break;
case MU_SHAPE_CARD_SQUARE:
Serial.println("square");
break;
case MU_SHAPE_CARD_TRIANGLE:
Serial.println("triangle");
break;
default:
Serial.print("unknow card type: ");
Serial.println(Mu.getValue(VISION_SHAPE_CARD_DETECT, kLabel));
break;
}
} else {
digitalWrite(6, LOW);
digitalWrite(9, HIGH);
Serial.println("vision shape card undetected.");
}
Serial.print("fps = ");
Serial.println(1000/(millis()-timeStart));
Serial.println();
}