• Witaj na Forum Arduino Polska! Zapraszamy do rejestracji!
  • Znajdziesz tutaj wiele informacji na temat hardware / software.
Witaj! Logowanie Rejestracja


Ocena wątku:
  • 0 głosów - średnia: 0
  • 1
  • 2
  • 3
  • 4
  • 5
odczyt sensorów + danych z myszki przez usb shield
#1
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ę Smile
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();
}
 
Odpowiedź
#2
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.
 
Odpowiedź
#3
(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.
- uC: ARM Angel , AVR, Z8, PIC, 8051 / CPU: MC680x0, MC683xx, Z-80, 6502
- CPLD, FPGA, GAL
- GSM, ISDN, ETH, USB, RS232C/485/422
- C, ASM, CUPL, PHP

http://er-mik.prv.pl/projekty_avt.php * http://er-mik.prv.pl/ * http://kolejki.prv.pl/

KA-NUCLEO-F411CE Idea , ESP32, Mega2560, UNO PLUS
 
Odpowiedź
#4
Dzięki za odpowiedź. Dołączam oczywiście moduły, sęk w tym, że nic ostatecznie nie działa Smile
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 Smile
 
Odpowiedź
#5
(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.
- uC: ARM Angel , AVR, Z8, PIC, 8051 / CPU: MC680x0, MC683xx, Z-80, 6502
- CPLD, FPGA, GAL
- GSM, ISDN, ETH, USB, RS232C/485/422
- C, ASM, CUPL, PHP

http://er-mik.prv.pl/projekty_avt.php * http://er-mik.prv.pl/ * http://kolejki.prv.pl/

KA-NUCLEO-F411CE Idea , ESP32, Mega2560, UNO PLUS
 
Odpowiedź
#6
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 Smile
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);
  }}
 
Odpowiedź
#7
(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.
- uC: ARM Angel , AVR, Z8, PIC, 8051 / CPU: MC680x0, MC683xx, Z-80, 6502
- CPLD, FPGA, GAL
- GSM, ISDN, ETH, USB, RS232C/485/422
- C, ASM, CUPL, PHP

http://er-mik.prv.pl/projekty_avt.php * http://er-mik.prv.pl/ * http://kolejki.prv.pl/

KA-NUCLEO-F411CE Idea , ESP32, Mega2560, UNO PLUS
 
Odpowiedź
#8
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.
 
Odpowiedź
#9
Wywaliłem pierdoły na inne porty i śmiga jak szalone Big Grin Dziękuję Kaczakat, gdyby nie Ty spędziłbym nad tym kolejne 5 lat swojego życia Smile
Es2 - dzięki Tobie też zgłębiłem parę ciekawych tematów, dzięki! Smile
Re We La Cja normalnie Smile
 
Odpowiedź
  


Skocz do:


Przeglądający: 1 gości