odczyt sensorów + danych z myszki przez usb shield - michalm89 - 09-07-2018
Cześć,
coś mi umyka, może ktoś mnie delikatnie naprowadzi.
Mam podłączone do Arduino Uno r3:
- czujnik odległości hc-sr04
- bluetooth hc-05
- enkoder
- pare ledów
- USB host shield z myszką do sczytywania pozycji
Złączenie kodu zawierającego pierwsze 4 pozycje nie sprawiło większego problemu, jednak czegoś nie wiem, co by pozwoliło dołączyć do programu usb shield z myszką. Zwyczajne scalenie kodów jak widzę nie wchodzi w grę
Moglibyście mnie naprowadzić, który temat powinienem zgłębić lub co mi umyka?
Wystrugany kod:
Kod: //czujnik odległości
#define trigPin 12
#define echoPin 11
//
//diody
#define czerwona 18
#define zielona 17
#define niebieska 19
//
//ekran
#include <LiquidCrystal.h>
LiquidCrystal lcd(2, 3, 4, 5, 6, 7); //Informacja o podłączeniu nowego wyświetlacza
//
int akcja = 0;
unsigned long previousMillis = 0;
const long interval = 500;
// enkoder
#include <Encoder.h>
Encoder myEnc(15, 16);
//
void setup() {
Serial.begin( 9600 );
lcd.begin(16, 2); //ekran
lcd.clear();
lcd.setCursor(0, 0); //Ustawienie kursora
lcd.print("Dystans Rotacja");
lcd.setCursor(0,1);
pinMode(trigPin, OUTPUT); //Pin, do którego podłączymy trig jako wyjście
pinMode(echoPin, INPUT); //a echo, jako wejście
pinMode(czerwona, OUTPUT);
pinMode(zielona, OUTPUT);
pinMode(niebieska, OUTPUT);
}
// enkoder
long oldPosition = -999;
//
void loop() {
unsigned long currentMillis = millis();
if (currentMillis - previousMillis >= interval) {
// save the last time
previousMillis = currentMillis;
Serial.print(zmierzOdleglosc());
Serial.println(" cm");
lcd.setCursor(0, 1); //Ustawienie kursora w odpowiednim momencie
lcd.print(zmierzOdleglosc()); //Wyświetlenie tekstu
lcd.print(" cm ");
zakres(1, 25); //Włącz alarm, jeśli w odległości od 10 do 25 cm od czujnika jest przeszkoda
zakres2(26, 200);
reakcja();
}
// enkoder
long newPosition = myEnc.read();
if (newPosition != oldPosition) {
oldPosition = newPosition;
Serial.println(newPosition);
lcd.setCursor(10, 1); //Ustawienie kursora w odpowiednim momencie
lcd.print(newPosition); //Wyświetlenie tekstu
lcd.print(" ");
}
//
}
int zmierzOdleglosc() {
long czas, dystans;
digitalWrite(trigPin, LOW);
delayMicroseconds(2);
digitalWrite(trigPin, HIGH);
delayMicroseconds(10);
digitalWrite(trigPin, LOW);
czas = pulseIn(echoPin, HIGH);
dystans = czas / 58;
return dystans;
}
void zakres(int a, int b) {
int jakDaleko = zmierzOdleglosc();
if ((jakDaleko > a) && (jakDaleko < b)) {
digitalWrite(czerwona, HIGH);
akcja = 1;
} else {
digitalWrite(czerwona, LOW);
akcja = 0;
}
}
void zakres2(int a, int b) {
int jakDaleko = zmierzOdleglosc();
if ((jakDaleko > a) && (jakDaleko < b)) {
digitalWrite(zielona, HIGH);
} else {
digitalWrite(zielona, LOW);
}
}
void reakcja() {
if (akcja == 1) {
digitalWrite(niebieska, HIGH);
} else {
digitalWrite(niebieska, LOW);
}}
Co bym chciał dołączyć:
Kod: #include <hidboot.h>
#include <usbhub.h>
// Satisfy the IDE, which needs to see the include statment in the ino too.
#ifdef dobogusinclude
#include <spi4teensy3.h>
#endif
#include <SPI.h>
class MouseRptParser : public MouseReportParser
{
protected:
void OnMouseMove (MOUSEINFO *mi);
void OnLeftButtonUp (MOUSEINFO *mi);
void OnLeftButtonDown (MOUSEINFO *mi);
void OnRightButtonUp (MOUSEINFO *mi);
void OnRightButtonDown (MOUSEINFO *mi);
void OnMiddleButtonUp (MOUSEINFO *mi);
void OnMiddleButtonDown (MOUSEINFO *mi);
};
void MouseRptParser::OnMouseMove(MOUSEINFO *mi)
{
Serial.print("dx=");
Serial.print(mi->dX, DEC);
Serial.print(" dy=");
Serial.println(mi->dY, DEC);
};
void MouseRptParser::OnLeftButtonUp (MOUSEINFO *mi)
{
Serial.println("L Butt Up");
};
void MouseRptParser::OnLeftButtonDown (MOUSEINFO *mi)
{
Serial.println("L Butt Dn");
};
void MouseRptParser::OnRightButtonUp (MOUSEINFO *mi)
{
Serial.println("R Butt Up");
};
void MouseRptParser::OnRightButtonDown (MOUSEINFO *mi)
{
Serial.println("R Butt Dn");
};
void MouseRptParser::OnMiddleButtonUp (MOUSEINFO *mi)
{
Serial.println("M Butt Up");
};
void MouseRptParser::OnMiddleButtonDown (MOUSEINFO *mi)
{
Serial.println("M Butt Dn");
};
USB Usb;
USBHub Hub(&Usb);
HIDBoot<USB_HID_PROTOCOL_MOUSE> HidMouse(&Usb);
MouseRptParser Prs;
void setup()
{
Serial.begin( 115200 );
#if !defined(__MIPSEL__)
while (!Serial); // Wait for serial port to connect - used on Leonardo, Teensy and other boards with built-in USB CDC serial connection
#endif
Serial.println("Start");
if (Usb.Init() == -1)
Serial.println("OSC did not start.");
delay( 200 );
HidMouse.SetReportParser(0, &Prs);
}
void loop()
{
Usb.Task();
}
RE: odczyt sensorów + danych z myszki przez usb shield - kaczakat - 10-07-2018
Nie mam pojęcia, czy finalnie Ci to zadziała ale z czym konkretnie masz problem? Dołączasz kolejny moduł dostawiając setup do setup, loop do loop, itp i patrzysz co się dzieje. Zapewne będzie konflikt na pinach SPI 11,12, musisz poszukać innych do obsługi ogólnych I/O, dołączanie kolejnych czynności wymaga czasu, więc tam gdzie się da rób rzeczy z max speed, np. zwiększ prędkość Serial na 115200 i testuj. Jak nie będzie działać zgodnie z oczekiwaniami posprawdzaj ile co zajmuje korzystając z analogicznej do millis() funkcji micros() i wywalaj spowalniacze - możesz sobie sprawdzić ile trwa loop z pustym przebiegiem, ile trwają poszczególne funkcje.
RE: odczyt sensorów + danych z myszki przez usb shield - es2 - 10-07-2018
(10-07-2018, 10:43)kaczakat napisał(a): rób rzeczy z max speed, np. zwiększ prędkość Serial na 115200 Albo/i użyj przerwań nadawczych od USART.
RE: odczyt sensorów + danych z myszki przez usb shield - michalm89 - 10-07-2018
Dzięki za odpowiedź. Dołączam oczywiście moduły, sęk w tym, że nic ostatecznie nie działa
Z początku odczyt odległości pokazuje co nieco, ale zamiast co pół sekundy to co jakieś 5 sekund. Po ruszeniu enkoderem, czy myszką nic już nie działa. Dzięki raz jeszcze za wskazówki, popróbuje jeszcze to i owo
RE: odczyt sensorów + danych z myszki przez usb shield - es2 - 10-07-2018
(10-07-2018, 14:05)michalm89 napisał(a): ale zamiast co pół sekundy to co jakieś 5 sekund. Ustal, która funkcja powoduje takie opóźnienie.
RE: odczyt sensorów + danych z myszki przez usb shield - michalm89 - 10-07-2018
Ok, to tutaj mam połączone oba kody. Metodą eliminacji wyszło na to, że problematyczna jest linijka "if (Usb.Init() == -1)" z kodu mouse hida.
Jej obecność powoduje opóznienia i brak reakcji ze strony czujnika odległości i enkodera, ale myszka za to działa.
Po skasowaniu linijki myszka jest martwa, za to reszta czujników śmiga i to w pożądanej prędkości
Może coś by to mówiło doświadczonym kolego i koleżankom?
Kod: #include <hidboot.h>
#include <usbhub.h>
// Satisfy the IDE, which needs to see the include statment in the ino too.
#ifdef dobogusinclude
#include <spi4teensy3.h>
#endif
#include <SPI.h>
class MouseRptParser : public MouseReportParser
{
protected:
void OnMouseMove (MOUSEINFO *mi);
void OnLeftButtonUp (MOUSEINFO *mi);
void OnLeftButtonDown (MOUSEINFO *mi);
void OnRightButtonUp (MOUSEINFO *mi);
void OnRightButtonDown (MOUSEINFO *mi);
void OnMiddleButtonUp (MOUSEINFO *mi);
void OnMiddleButtonDown (MOUSEINFO *mi);
};
void MouseRptParser::OnMouseMove(MOUSEINFO *mi)
{
Serial.print("dx=");
Serial.print(mi->dX, DEC);
Serial.print(" dy=");
Serial.println(mi->dY, DEC);
};
void MouseRptParser::OnLeftButtonUp (MOUSEINFO *mi)
{
Serial.println("L Butt Up");
};
void MouseRptParser::OnLeftButtonDown (MOUSEINFO *mi)
{
Serial.println("L Butt Dn");
};
void MouseRptParser::OnRightButtonUp (MOUSEINFO *mi)
{
Serial.println("R Butt Up");
};
void MouseRptParser::OnRightButtonDown (MOUSEINFO *mi)
{
Serial.println("R Butt Dn");
};
void MouseRptParser::OnMiddleButtonUp (MOUSEINFO *mi)
{
Serial.println("M Butt Up");
};
void MouseRptParser::OnMiddleButtonDown (MOUSEINFO *mi)
{
Serial.println("M Butt Dn");
};
USB Usb;
USBHub Hub(&Usb);
HIDBoot<USB_HID_PROTOCOL_MOUSE> HidMouse(&Usb);
MouseRptParser Prs;
//czujnik odległości
#define trigPin 12
#define echoPin 11
//
//diody
#define czerwona 18
#define zielona 17
#define niebieska 19
//
//ekran
#include <LiquidCrystal.h>
LiquidCrystal lcd(2, 3, 4, 5, 6, 7); //Informacja o podłączeniu nowego wyświetlacza
//
// enkoder
#include <Encoder.h>
Encoder myEnc(15, 16);
//
int akcja = 0;
unsigned long previousMillis = 0;
const long interval = 500;
void setup() {
Serial.begin( 115200 );
lcd.begin(16, 2); //ekran
lcd.clear();
lcd.setCursor(0, 0); //Ustawienie kursora
lcd.print("Dystans Rotacja");
lcd.setCursor(0,1);
pinMode(trigPin, OUTPUT); //Pin, do którego podłączymy trig jako wyjście
pinMode(echoPin, INPUT); //a echo, jako wejście
pinMode(czerwona, OUTPUT);
pinMode(zielona, OUTPUT);
pinMode(niebieska, OUTPUT);
#if !defined(__MIPSEL__)
while (!Serial); // Wait for serial port to connect - used on Leonardo, Teensy and other boards with built-in USB CDC serial connection
#endif
Serial.println("Start");
if (Usb.Init() ==-1)
Serial.println("OSC did not start.");
delay( 200 );
HidMouse.SetReportParser(0, &Prs);
}
// enkoder
long oldPosition = -999;
//
void loop() {
Usb.Task();
unsigned long currentMillis = millis();
if (currentMillis - previousMillis >= interval) {
// save the last time
previousMillis = currentMillis;
Serial.print(zmierzOdleglosc());
Serial.println(" cm");
lcd.setCursor(0, 1); //Ustawienie kursora w odpowiednim momencie
lcd.print(zmierzOdleglosc()); //Wyświetlenie tekstu
lcd.print(" cm ");
zakres(1, 25); //Włącz alarm, jeśli w odległości od 10 do 25 cm od czujnika jest przeszkoda
zakres2(26, 200);
reakcja();
}
// enkoder
long newPosition = myEnc.read();
if (newPosition != oldPosition) {
oldPosition = newPosition;
Serial.println(newPosition);
lcd.setCursor(10, 1); //Ustawienie kursora w odpowiednim momencie
lcd.print(newPosition); //Wyświetlenie tekstu
lcd.print(" ");
}
//
}
int zmierzOdleglosc() {
long czas, dystans;
digitalWrite(trigPin, LOW);
delayMicroseconds(2);
digitalWrite(trigPin, HIGH);
delayMicroseconds(10);
digitalWrite(trigPin, LOW);
czas = pulseIn(echoPin, HIGH);
dystans = czas / 58;
return dystans;
}
void zakres(int a, int b) {
int jakDaleko = zmierzOdleglosc();
if ((jakDaleko > a) && (jakDaleko < b)) {
digitalWrite(czerwona, HIGH);
akcja = 1;
} else {
digitalWrite(czerwona, LOW);
akcja = 0;
}
}
void zakres2(int a, int b) {
int jakDaleko = zmierzOdleglosc();
if ((jakDaleko > a) && (jakDaleko < b)) {
digitalWrite(zielona, HIGH);
} else {
digitalWrite(zielona, LOW);
}
}
void reakcja() {
if (akcja == 1) {
digitalWrite(niebieska, HIGH);
} else {
digitalWrite(niebieska, LOW);
}}
RE: odczyt sensorów + danych z myszki przez usb shield - es2 - 10-07-2018
(10-07-2018, 22:18)michalm89 napisał(a): Ok, to tutaj mam połączone oba kody. Metodą eliminacji wyszło na to, że problematyczna jest linijka "if (Usb.Init() == -1)" z kodu mouse hida.
Musisz więc szukać dalej, co powoduje opóźnienia. Arduinowcy uwielbiają delay i pętle, w których czekają na zdarzenie. Jakie są tego efekty sam widzisz.
Najprostszym rozwiązaniem będzie pewnie przeniesienie zadań czujnika odległości i enkodera na przerwania.
RE: odczyt sensorów + danych z myszki przez usb shield - kaczakat - 11-07-2018
Kasowanie linijki w setupie nie ma sensu, po prostu nie kończysz inicjalizacji sprzętu to potem nie ma co obsługiwać. Pisałem Ci o pinach 11 i 12, a Ty tam dalej masz pierdoły zdefiniowane. Piny 9-13 zostaw TYLKO dla USB (SPI i INT, zresztą tylko się domyślam jakiej biblioteki używasz). Resztę sprzętu albo na razie odłącz, albo przenieś na inne piny.
RE: odczyt sensorów + danych z myszki przez usb shield - michalm89 - 11-07-2018
Wywaliłem pierdoły na inne porty i śmiga jak szalone Dziękuję Kaczakat, gdyby nie Ty spędziłbym nad tym kolejne 5 lat swojego życia
Es2 - dzięki Tobie też zgłębiłem parę ciekawych tematów, dzięki!
Re We La Cja normalnie
|