Skocz do zawartości

Przeszukaj forum

Pokazywanie wyników dla tagów 'bluetooth'.

  • Szukaj wg tagów

    Wpisz tagi, oddzielając przecinkami.
  • Szukaj wg autora

Typ zawartości


Kategorie forum

  • Elektronika i programowanie
    • Elektronika
    • Arduino, ESP
    • Mikrokontrolery
    • Raspberry Pi
    • Inne komputery jednopłytkowe
    • Układy programowalne
    • Programowanie
    • Zasilanie
  • Artykuły, projekty, DIY
    • Artykuły redakcji (blog)
    • Artykuły użytkowników
    • Projekty - roboty
    • Projekty - DIY
    • Projekty - DIY (początkujący)
    • Projekty - w budowie (worklogi)
    • Wiadomości
  • Pozostałe
    • Oprogramowanie CAD
    • Druk 3D
    • Napędy
    • Mechanika
    • Zawody/Konkursy/Wydarzenia
    • Sprzedam/Kupię/Zamienię/Praca
    • Inne
  • Ogólne
    • Ogłoszenia organizacyjne
    • Dyskusje o FORBOT.pl
    • Na luzie
    • Kosz

Szukaj wyników w...

Znajdź wyniki, które zawierają...


Data utworzenia

  • Rozpocznij

    Koniec


Ostatnia aktualizacja

  • Rozpocznij

    Koniec


Filtruj po ilości...

Data dołączenia

  • Rozpocznij

    Koniec


Grupa


Znaleziono 11 wyników

  1. Cześć wszystkim, Chciałbym przetestować pewien program który znalazłem na internecie, niestety pojawia się problem przy instalacji biblioteki na Raspberry Pi , czy ktoś jest w stanie pomóc?
  2. Witam, buduję swojego jeżdżącego robota sterowanego z aplikacji na telefon. Znalazłem w internecie poniższy kod: #include <math.h> /*BTS7960 Motor Driver Carrier*/ const int MotorRight_R_EN = 4; // Pin to control the clockwise direction of Right Motor const int MotorRight_L_EN = 5; // Pin to control the counterclockwise direction of Right Motor const int MotorLeft_R_EN = 8; // Pin to control the clockwise direction of Left Motor const int MotorLeft_L_EN = 9; // Pin to control the counterclockwise direction of Left Motor const int Rpwm1 = 6; // pwm output - motor A const int Lpwm1 = 7; // pwm output - motor B const int Rpwm2 = 2; // pwm output - motor A const int Lpwm2 = 3; // pwm output - motor B long pwmLvalue = 255; long pwmRvalue = 255; byte pwmChannel; const char startOfNumberDelimiter = '<'; const char endOfNumberDelimiter = '>'; int robotControlState; int last_mspeed; void setup(){ /* For Arduino Mega 2560 Serial1 RX - pin 19 Serial1 TX - pin 18 */ Serial1.begin(9600);//Default Bluetooth Baudrate for HC-05 //Setup Right Motors pinMode(MotorRight_R_EN, OUTPUT); //Initiates Motor Channel A1 pin pinMode(MotorRight_L_EN, OUTPUT); //Initiates Motor Channel A2 pin //Setup Left Motors pinMode(MotorLeft_R_EN, OUTPUT); //Initiates Motor Channel B1 pin pinMode(MotorLeft_L_EN, OUTPUT); //Initiates Motor Channel B2 pin //Setup PWM pins as Outputs pinMode(Rpwm1, OUTPUT); pinMode(Lpwm1, OUTPUT); pinMode(Rpwm2, OUTPUT); pinMode(Lpwm2, OUTPUT); stop_Robot(); }// void setup() void loop(){ //int i = 0; if (Serial1.available()) { processInput(); } }// void loop() void processInput (){ static long receivedNumber = 0; static boolean negative = false; byte c = Serial1.read (); switch (c){ case endOfNumberDelimiter: if (negative) SetPWM(- receivedNumber, pwmChannel); else SetPWM(receivedNumber, pwmChannel); // fall through to start a new number case startOfNumberDelimiter: receivedNumber = 0; negative = false; pwmChannel = 0; break; case 'f': // Go FORWARD go_Forward(255); //Serial.println("forward"); break; case 'b': // Go BACK go_Backwad(255); break; case 'r': turn_Right(255); break; case 'l': turn_Left(255); break; case 'c': // Top Right move_RightForward(255); break; case 'd': // Top Left move_LeftForward(255); break; case 'e': // Bottom Right move_RightBackward(255); break; case 'h': // Bottom Left move_LeftBackward(255); break; case 's': stop_Robot(); break; case 'x': pwmChannel = 1; // Rpwm1 break; case 'y': // Lpwm1 pwmChannel = 2; break; case '0' ... '9': receivedNumber *= 10; receivedNumber += c - '0'; break; case '-': negative = true; break; } // end of switch } // void processInput () void stop_Robot(){ // robotControlState = 0 if(robotControlState!=0){ //SetMotors(2); analogWrite(Rpwm1, 0); analogWrite(Lpwm1, 0); analogWrite(Rpwm2, 0); analogWrite(Lpwm2, 0); robotControlState = 0; } }// void stopRobot() void turn_Right(int mspeed){ // robotControlState = 1 if(robotControlState!=1 || last_mspeed!=mspeed){ SetMotors(1); analogWrite(Rpwm1, 0); analogWrite(Lpwm1, mspeed); analogWrite(Rpwm2, mspeed); analogWrite(Lpwm2, 0); robotControlState=1; last_mspeed=mspeed; } }// void turn_Right(int mspeed) void turn_Left(int mspeed){ // robotControlState = 2 if(robotControlState!=2 || last_mspeed!=mspeed){ SetMotors(1); analogWrite(Rpwm1, mspeed); analogWrite(Lpwm1, 0); analogWrite(Rpwm2, 0); analogWrite(Lpwm2, mspeed); robotControlState=2; last_mspeed=mspeed; } }// void turn_Left(int mspeed) void go_Forward(int mspeed){ // robotControlState = 3 if(robotControlState!=3 || last_mspeed!=mspeed){ SetMotors(1); analogWrite(Rpwm1, mspeed); analogWrite(Lpwm1, 0); analogWrite(Rpwm2, mspeed); analogWrite(Lpwm2, 0); robotControlState=3; last_mspeed=mspeed; } }// void goForward(int mspeed) void go_Backwad(int mspeed){ // robotControlState = 4 if(robotControlState!=4 || last_mspeed!=mspeed){ SetMotors(1); analogWrite(Rpwm1, 0); analogWrite(Lpwm1, mspeed); analogWrite(Rpwm2, 0); analogWrite(Lpwm2, mspeed); robotControlState=4; last_mspeed=mspeed; } }// void goBackwad(int mspeed) void move_RightForward(int mspeed){ // robotControlState = 5 if(robotControlState!=5 || last_mspeed!=mspeed){ SetMotors(1); analogWrite(Rpwm1, mspeed*0.4); analogWrite(Lpwm1, 0); analogWrite(Rpwm2, mspeed); analogWrite(Lpwm2, 0); robotControlState=5; last_mspeed=mspeed; } }// void move_RightForward(int mspeed) void move_LeftForward(int mspeed){ // robotControlState = 6 if(robotControlState!=6 || last_mspeed!=mspeed){ SetMotors(1); analogWrite(Rpwm1, mspeed); analogWrite(Lpwm1, 0); analogWrite(Rpwm2, mspeed*0.4); analogWrite(Lpwm2, 0); robotControlState=6; last_mspeed=mspeed; } }// move_LeftForward(int mspeed) void move_RightBackward(int mspeed){ // robotControlState = 7 if(robotControlState!=7 || last_mspeed!=mspeed){ SetMotors(1); analogWrite(Rpwm1, 0); analogWrite(Lpwm1, mspeed*0.4); analogWrite(Rpwm2, 0); analogWrite(Lpwm2, mspeed); robotControlState=7; last_mspeed=mspeed; } }// void move_RightBackward(int mspeed) void move_LeftBackward(int mspeed){ // robotControlState = 8 if(robotControlState!=8 || last_mspeed!=mspeed){ SetMotors(1); analogWrite(Rpwm1, 0); analogWrite(Lpwm1, mspeed); analogWrite(Rpwm2, 0); analogWrite(Lpwm2, mspeed*0.4); robotControlState=8; last_mspeed=mspeed; } }// void move_LeftBackward(int mspeed) void stopRobot(int delay_ms){ SetMotors(2); analogWrite(Rpwm1, 0); analogWrite(Lpwm1, 0); analogWrite(Rpwm2, 0); analogWrite(Lpwm2, 0); delay(delay_ms); }// void stopRobot(int delay_ms) void SetPWM(const long pwm_num, byte pwm_channel){ if(pwm_channel==1){ // DRIVE MOTOR analogWrite(Rpwm1, 0); analogWrite(Rpwm2, 0); analogWrite(Lpwm1, pwm_num); analogWrite(Lpwm2, pwm_num); pwmRvalue = pwm_num; } else if(pwm_channel==2){ // STEERING MOTOR analogWrite(Lpwm1, 0); analogWrite(Lpwm2, 0); analogWrite(Rpwm1, pwm_num); analogWrite(Rpwm2, pwm_num); pwmLvalue = pwm_num; } }// void SetPWM (const long pwm_num, byte pwm_channel) void SetMotors(int controlCase){ switch(controlCase){ case 1: digitalWrite(MotorRight_R_EN, HIGH); digitalWrite(MotorRight_L_EN, HIGH); digitalWrite(MotorLeft_R_EN, HIGH); digitalWrite(MotorLeft_L_EN, HIGH); break; case 2: digitalWrite(MotorRight_R_EN, LOW); digitalWrite(MotorRight_L_EN, LOW); digitalWrite(MotorLeft_R_EN, LOW); digitalWrite(MotorLeft_L_EN, LOW); break; } }// void SetMotors(int controlCase) I nie mogę zrozumieć jakie zdanie mają zmienne : startOfNumberDelimiter oraz endOfNumberDelimiter ? Co one w tym programie robią ?
  3. Witam, mam problem z modułem bluetooth, którego potrzebuje do projektu DIY. Wszystko normalnie działało na baudzie 9600 i wprowadzałem komendy w arduino IDE. Po wpisaniu komendy AT+RESET, której zadaniem jest reset modułu straciłem jakąkolwiek możliwość dalszej komunikacji z modułem. Dioda wskazująca na oczekiwanie parowania miga tak jak wczesniej ale nie jestem wstanie się sparować a po wpisywaniu jakikolwiek komend nie dostaje żadnej odpowiedzi. Wbudowany guzik też nie reaguje, nie wiem juz co robic :(
  4. Witam Pisze ponieważ nie mogę poradzić sobie z błędem który dostaje podczas podłączania modułu bluetooth XM-15. Przeglądałem strony w poszukiwaniu jakieś pomocy nie udało mi się tego niestety znaleźć. Jestem nowy wiec odrazu rzuciłem się na głęboka wodę nie sprawdzając tego moduły. Konfiguracja polegała na tym że podłączyłem moduł do arduino i działało to ok. Podczas pisania programów miałem problem z uruchomieniem monitora portu szeregowego. Błąd mówił ze port jest zajęty. Zacząłem szukać po internecie co to może być i znalazłem ,że może to być poprostu złe dobrana prędkość. Więc spróbowałem ja zmieniać na 9600. Na forum jest pokazane jak zrobić to z modelem HC za pomocą polecenia AT. Napisane jest tam ze po wpisaniu AT powinno wyskoczyć " AT ok ". U mnie wyskakuje " Witaj AT ! ", pisałem jakiś prosty program który miał właśnie tak dziać, że pisze coś i on ma wyświetlać Witaj + "coś "+ !. Teraz napisałem prosty program aby wgl sprawdzić czy jakoś ten moduł mogę podłączyć i dostaje błąd problemu z wgrywaniem na płytkę. Wygląda on tak : avrdude: Version 6.3-20171130 Copyright (c) 2000-2005 Brian Dean, http://www.bdmicro.com/ Copyright (c) 2007-2014 Joerg Wunsch System wide configuration file is "C:\Program Files\WindowsApps\ArduinoLLC.ArduinoIDE_1.8.19.0_x86__mdqgnx93n4wtt\hardware\tools\avr/etc/avrdude.conf" Using Port : COM4 Using Programmer : arduino Overriding Baud Rate : 115200 avrdude: stk500_recv(): programmer is not responding avrdude: stk500_getsync() attempt 1 of 10: not in sync: resp=0xe2 avrdude: stk500_recv(): programmer is not responding avrdude: stk500_getsync() attempt 2 of 10: not in sync: resp=0xe2 avrdude: stk500_recv(): programmer is not responding avrdude: stk500_getsync() attempt 3 of 10: not in sync: resp=0xe2 avrdude: stk500_recv(): programmer is not responding avrdude: stk500_getsync() attempt 4 of 10: not in sync: resp=0xe2 avrdude: stk500_recv(): programmer is not responding avrdude: stk500_getsync() attempt 5 of 10: not in sync: resp=0xe2 avrdude: stk500_recv(): programmer is not responding avrdude: stk500_getsync() attempt 6 of 10: not in sync: resp=0xe2 avrdude: stk500_recv(): programmer is not responding avrdude: stk500_getsync() attempt 7 of 10: not in sync: resp=0xe2 avrdude: stk500_recv(): programmer is not responding avrdude: stk500_getsync() attempt 8 of 10: not in sync: resp=0xe2 avrdude: stk500_recv(): programmer is not responding avrdude: stk500_getsync() attempt 9 of 10: not in sync: resp=0xe2 avrdude: stk500_recv(): programmer is not responding avrdude: stk500_getsync() attempt 10 of 10: not in sync: resp=0xe2 avrdude done. Thank you. Problem z wgrywaniem na płytkę. Program który wgrywam jest następujący : int data; void setup() { // put your setup code here, to run once: Serial.begin(115200); } void loop() { // put your main code here, to run repeatedly: data=Serial.read(); Serial.println(data); delay(200); } Jeśli odepnę wejścia TX, RX program działa normalnie i nie żadnego problemu. Po podłączeniu modułu tylko do zasilania i uruchomieniu terminala na telefonie po wpisaniu polecenie AT dostaje jakieś znaczki których nie można przeczytać. Używam Arduino Uno. Z góry przepraszam jeśli coś namieszałem jestem początkującym i to mój pierwszy problem którego nie mogę przejść. Proszę o pomoc
  5. Witam Buduję robota na kołach. W jaki sposób rozwiązać zmianę prędkości silników ? Myślałem żeby zrobić kilka przycisków w aplikacji, wybranie powodowałoby ustawienie danej prędkości.
  6. Multimetry logujące dane na komputerze są drogie. Nie mówiąc już o miernikach monitorujących równocześnie napięcie, natężenie i moc oraz rezystancję odbiornika. Może więc warto zrobić coś takiego samemu? Projekt służy jedynie do pomiaru w obwodach prądu stałego przy NIEWIELKICH napięciach (nominalnie do 26V) i ograniczonym natężeniu (sprawdź specyfikację zastosowanego modułu). Absolutnie nie należy go stosować przy napięciu sieciowym, czy też wysokowydajnych źródłach prądu (np akumulator samochodowy pomimo bezpiecznego napiącia 13V w razie zwarcia może dostarczyć KILKASET AMPERÓW, co również może okazać się groźne)! Składniki: Arduino Nano (wbudowane gniazdo Micro USB zapewni łatwe zasilanie z powerbanku, możemy też użyć Pro Mini, które zapewni większą energooszczędność) moduł miernika z magistralą I²C INA219 wyświetlacz LCD 2x16 z konwerterem I²C LCM1602 Bluetooth - UART np w postaci modułu HC-06 czy HC-05 bezpiecznik (zastosowałem PPTC 3A) gniazdo oraz wtyki bananowe 4 mm gniazdo DC 5.5/2.1 mm- Bluetooth HC-05 oraz 06 obsługują poziom logiczny napięć 3.3V. Gotowe moduły posiadają jednak na ogół stabilizator pozwalający zasilić je bezpośrednio z 5V. Nadal pozostaje jednak problem 5V "logicznych" z wyjścia UART (czyli pinu TX) w Arduino. Najlepiej zastosować tu dzielnik napięcia lub konwerter poziomów logicznych. Ja wstawiłem szeregowo rezystor by w razie czego ograniczyć natężenie prądu. To jeszcze nie "zabiło" HC-06, ale też nie jest rozwiązaniem "podręcznikowym" i zalecanym. Port nadawczy (TX) w Bluetooth możemy za to bez obaw podłączyć bezpośrednio z odbiorczym (RX) w Arduino. Kod źródłowy w tym wypadku był prawdę mówiąc banalny do napisania, gdyż wymagał jedynie drobnych zmian przykładu dla stosowanej biblioteki. #include <Wire.h> #include <Adafruit_INA219.h> //https://github.com/adafruit/Adafruit_INA219 #include <LiquidCrystal_I2C.h> //https://github.com/fdebrabander/Arduino-LiquidCrystal-I2C-library #include <Narcoleptic.h> //https://github.com/rcook/narcoleptic #define DiodeVoltageDrop 0.42 LiquidCrystal_I2C lcd(0x27, 16, 2); Adafruit_INA219 ina219; void setup(void) { Serial.begin(9600); while (!Serial) { // will pause Zero, Leonardo, etc until serial console opens delay(1); } Narcoleptic.disableTimer1(); Narcoleptic.disableTimer2(); Narcoleptic.disableADC(); Narcoleptic.disableSPI(); uint32_t currentFrequency; // Initialize the INA219. // By default the initialization will use the largest range (32V, 2A). However // you can call a setCalibration function to change this range (see comments). ina219.begin(); // To use a slightly lower 32V, 1A range (higher precision on amps): //ina219.setCalibration_32V_1A(); // Or to use a lower 16V, 400mA range (higher precision on volts and amps): //ina219.setCalibration_16V_400mA(); lcd.begin(); lcd.backlight(); } void loop(void) { // float shuntvoltage = 0; float busvoltage = 0; float current_mA = 0; // float loadvoltage = 0; float power_mW = 0; // shuntvoltage = ina219.getShuntVoltage_mV(); busvoltage = ina219.getBusVoltage_V() + DiodeVoltageDrop; current_mA = 1086.5 / 1104.0 * (ina219.getCurrent_mA() - 1.4); power_mW = abs(busvoltage * current_mA); float impedance = abs(busvoltage / current_mA * 1000.0); // power_mW = ina219.getPower_mW(); // loadvoltage = busvoltage + (shuntvoltage / 1000); Serial.print(busvoltage); Serial.print("V "); Serial.print(current_mA, 1); Serial.print("mA "); Serial.print(power_mW, 0); Serial.print("mW "); Serial.print(impedance, 1); Serial.println((char)244); lcd.clear(); lcd.print(busvoltage); lcd.print("V "); lcd.print(current_mA, 1); lcd.print("mA"); lcd.setCursor(0, 1); lcd.print(power_mW, 0); lcd.print("mW "); lcd.print(impedance, 1); lcd.print((char)244); Narcoleptic.delay(500); } Do pomiaru napięcia przez układ INA219 wymagane jest połączenie GND zasilania elektroniki z GND mierzonego obwodu. Z tego też względu nie zalecam zasilać urządzenia z gniazda USB w komputerze. W razie pomyłki możemy uszkodzić komputer! Dlatego do "kablowania" danych użyłem Bluetooth. INA219 niestety nie toleruje również odwrotnej polaryzacji - potencjał po stronie mierzonego prądu nie może być niższy względem GND. Może to doprowadzić do uszkodzenia układu. Nie jest to więc urządzenie odpowiednie do "ręcznego" pomiaru napięcia zwykłymi sondami z multimetru - niezmiernie łatwo tu o odwrotną polaryzację! Dla bezpieczeństwa wstawiłem diodę pomiędzy masą miernika a mierzonego układu. Nieco przekłamuje to pomiar napięcia (spadek napięcia na diodzie nie jest dokładnie stały, jak skorygowałem w szkicu). Za to sama konstrukcja powinna zapewnić wygodną obsługę. Z boku znajdziemy gniazdo DC do podłączenia zasilacza dla mierzonego układu oraz gniazda bananowe dla kabli "wyjściowych". Do zestawu oczywiście NIE dołączono uniwersalnego zestawu kabli pomiarowych. Musiałem więc zrobić je sobie sam Przewody z wtykiem bananowym 4 mm na wejściu są zakończone: wtykiem DC 5.5/2.1 mm (wtedy multimetr jest po prostu "przedłużaczem" zwykłego zasilacza) ponownie wtykiem bananowym, co umożliwia zastosowanie np "krokodylków" jako nakładki czy podłączenie "normalnego" multimetru celem kalibracji zaciskiem typu "hak" do bezpośredniego wpinania się w goldpiny Łatwo więc podłączymy nasze urządzenie pomiędzy zasilacz a odbiornik. Po podłączeniu komputera z modułem Bluetooth - UART utworzony jest wirtualny port szeregowy. Np dla Linuksa powstanie plik urządzenia /dev/rfcomm*. Uzyskane pomiary możemy zapisać w postaci logu np za pomocą putty czy też terminalowych narzędzi dla Linuksa. Napisałem też własny program w C++, który zapisze dane otrzymane z portu szeregowego do pliku. Skompilujemy go poprzez g++ serial2log.cpp serialib/serialib.cpp -o serial2log -std=c++17 Wcześniej należy jednak umieścić Serialib ::: Simple Serial Library w folderze serialib. Jako parametry wywoływanego programu podajemy adres portu szeregowego, baud rate oraz nazwę pliku tekstowego z logiem. Np: ./serial2log /dev/ttyUSB0 9600 log.txt Pracę kończymy w bardzo "brutalny" sposób: Ctrl + C. //g++ serial2log.cpp serialib/serialib.cpp -o serial2log -std=c++17 #include <iostream> #include <chrono> #include <thread> #include <fstream> #include <ctime> #include "serialib/serialib.h" //http://serialib.free.fr int main(int argc, char *argv[]) { if (argc != 4) { std::cout << "Usage: ./serial2log serial_port baud_rate log_file\n"; return 0; } serialib LS; // Object of the serialib class int Ret; // Used for return values char Buffer[128]; // Open serial port Ret=LS.Open(argv[1],atoi(argv[2])); // Open serial link if (Ret!=1) { // If an error occured... std::cout << "Error while opening port. Permission problem?\n"; // ... display a message ... return Ret; // ... quit the application } std::cout << "Serial port opened successfully!\n"; std::ofstream logfile; logfile.open(argv[3], std::ios::out | std::ios::app); /* Ret=LS.WriteString("AT\n"); // Send the command on the serial port if (Ret!=1) { // If the writting operation failed ... std::cout << "Error while writing data\n"; // ... display a message ... return Ret; // ... quit the application. } std::cout << "Write operation is successful \n"; */ while(1){ Ret=LS.ReadString(Buffer,'\n',128,5000); // Read a maximum of 128 characters with a timeout of 5 seconds // The final character of the string must be a line feed ('\n') if (Ret>0){ std::time_t currentTime = std::time(nullptr); std::cout << currentTime << " >> " << Buffer; // If a string has been read from, print the string logfile << currentTime << " >> " << Buffer << std::flush; } else std::cout << "TimeOut reached. No data received !\n"; // If not, print a message. std::this_thread::sleep_for(std::chrono::milliseconds(100)); } // Close the connection with the device LS.Close(); logfile.close(); return 0; } Zastosowanie: całkowanie numeryczne poboru prądu po czasie. Mamy urządzenie, którego "łakomstwo" zmienia się w czasie, a my chcemy oszacować czas jego pracy na akumulatorze. Musimy więc jakoś uśrednić jego pobór prądu. Np montaż paralaktyczny teleskopu pobiera inne natężenie prądu w trakcie podążania za ruchem dobowym nieba, a inne w trybie pozycjonowania na zadany obiekt (GoTo). Po testach będziemy mogli więc oszacować, jak długo będzie on pracował zasilany z akumulatora żelowego.
  7. Załozeniem projektu było stworzenie pojazdu czterokołowego sterowanego poprzez bluetooth, wykorzystujac wbudowany w telefon akcelerometr. Został on zbudowany na ramie starego samochodu zdalnie sterowanego, do którego zgubiona została aparatura. Głównym elementem robota jest rama robota terenowego wyposazona w silnik do napedzania osi tylnej pojazdu, oraz w silnik do skretu kołami przednimi. Po drobnych modyfikacjach została dostosowana do zamontowania płytki drukowanej oraz baterii. Zostały dodatkowo zaprojektowane i wydrukowane na drukarce 3d uchwyty na baterie. Wykorzystany został moduł arduino nano ( bazujacy na Atmedze 328P).moduł bluetooth HC-06 komunikujacy sie z arduino poprzez UART(RX,TX).Zasilany napieciem 3.3V. Zasieg modułu to około 10m.Wykorzystany został moduł L298N na podstawce umozliwiajacy sterowanie dwoma silnikami DC w obu kierunkach za pomoca 4 pinów, które mozna sterowac sygnałem PWM. Wykorzystana została bateria o napieciu 11,1V. Układ został zaprojektowany przy uzyciu oprogramowania EasyEda. w celu zwiekszenia jakosci oraz aby umiescic układ w wyznaczonym na ramie miejscu o wymiarach 50x50mm. Zaprojektowany został PCB,który został wykonany za pomoca metody termotranferu na laminacie z jednostronna warstwa miedzi Aby układ mógł zostac przylutowany metoda SMD, powyższy schemat musiał zostac wydrukowany na papierze kredowym w odbiciu lustrzanym. Nastepnie wytrawiono płytke. Jako wytrawiacz posłuzył nadsiarczan sodu (B327) zmieszany w odpowiedniej proporcji z woda. W kolejnym kroku nawiercono w płytce otwory posługujac sie wiertłem 1 mm.Nastepnie wszystkie elementy przylutowano do płytki w wyznaczonych miejscach, zrobiono to w taki sposób, aby wszystkie elementy znajdowały sie po tej samej stronie co ściezki. Program do obsługi został napisany a Arduino IDE, działa on według następującego schematu; do utworzenia interfejsu komunikujacego sie z samochodzikiem posłuzyłem sie aplikajca RoboRemo w wercji darmowej. Aplikacja wysyła do naszego modułu bluetooth dane dotyczace połozenia X oraz Y naszego telefonu. interfejs wyglada w nastepujacy sposób: Aby rozpoczać użytkowanie robota nalezy podłaczyć baterie odpowiednimi przewodami znajdujacymi sie z dołu urzadzenia (czerwony z czerwonym,niebieski z niebieskim),nastepnie uruchomić samochodzik przełaczajac przełacznik znajdujacy sie nad bateria. Po tej operacji pojazd jest gotowy do sparowania z telefonem. Aby to zrobic wystarczy kliknac przycisk "Połacz z samochodem" znajdujacy sie na ekranie. Jezeli otrzymamy bład połaczenia nalezy najpierw sparowac moduł bluetooth o nazwie "samochodzik" z naszym telefonem w ustawieniach telefonu(jezeli zostaniemy poproszeni o hasło nalezy wpisac 1234).Po udanym połaczeniu z samochodzikiem mozna przystapic do jazdy klikajac przycisk "JEDŹ!". Sterować moćna przechylajac telefon.Przechylenie przodu telefonu w dół spowoduje przyspieszenie, podniesienie -zatrzymanie, a nastepnie jazde do tyłu. Aby zmienic kierunek jazdy wystarczy przechylić telefon w prawo lub lewo. Przyciśniecie przycisku "STOP!" spowoduje zatrzymanie pojazdu. Jeszcze jedno zdjęcie pojazdu:
  8. Mój pierwszy projekt, którym jakiś czas temu zacząłem swoją przygodę z Arduino. Wężyk spustowy z interwałometrem sterowany radiowo poprzez Bluetooth. W astrofotografii popularne jest wykorzystanie techniki stackowania polegającej na łączeniu dziesiątek, czasem nawet setek zdjęć w jedno. Znacznie polepsza to stosunek sygnału do szumu. Niektóre zjawiska trwają kilka godzin (np zaćmienia, tranzyty, roje meteorów). Często też warunki atmosferyczne nie zachęcają do dłuższego pobytu na zewnątrz w środku nocy. Wyzwalacz pozwoli nam zautomatyzować rejestrację zjawisk astronomicznych. Hardware: - Arduino Pro Mini 3.3V (lub inne) - Bluetooth - UART np w postaci modułu HC-06 czy HC-05 - transoptor np PS2501 służący do zwierania obwodu, wymaga podłączenia przez stosowny rezystor (napięcie i natężenie prądu znajdziemy w dokumentacji technicznej transoptora) do pinu wyznaczonego w kodzie źródłowym (#define RelayPin). - koszyk na 3xAA - przełącznik kołyskowy do włączania - cienki kabel glośnikowy, zakończony microjackiem, wlutowany do transoptora. Pamiętajmy jednak, że również strona fotodetektora ma swoją polaryzację i transoptor powinien być podłączony do wtyczki w stosownej kolejności: Na początku do sterowania konieczne było ręczne wydawanie poleceń w terminalu. Do tego celu mogliśmy zainstalować aplikację Serial Bluetooth Terminal. e - pojedyncza ekspozycja w12 - poczekaj 12s i wykonaj zdjęcie s10i1w2 - wykonaj serię 10. zdjęć, z interwalem czasowym 1s, poczekaj 2s przed rozpoczęciem. Zawsze na końcu każdego z tych poleceń można dopisać t5, zadając czas naświetlania 5s. Samo t5 też działa. Może byc więc t5 w4t5 s10i1w2t5 Jeśli podamy własny czas naświetlania, aparat MUSI być ustawiony na czas B. #define RelayPin 13 String ReceivedData = "", numberstr; unsigned int i, character, NoExposures = 0; double exptime = 0.5, interval = 1, wait = 0; void setup() { Serial.begin(9600); pinMode(RelayPin, OUTPUT); digitalWrite(RelayPin, LOW); } void loop() { if (Serial.available() > 0) { ReceivedData = Serial.readStringUntil('\n'); ReceivedData.toLowerCase(); numberstr = ""; wait = 0; if (ReceivedData[0] == 'e' || ReceivedData[0] == 't' || ReceivedData[0] == 'w') { numberstr = extractvalue(ReceivedData, 'w'); wait = numberstr.toDouble(); if (wait != 0) { Serial.print("Wait "); Serial.print(wait); Serial.println(" s before start exposure."); } delay(wait * 1000); Serial.print("Exposure"); numberstr = extractvalue(ReceivedData, 't'); exptime = numberstr.toDouble(); if (exptime != 0) { Serial.print(" time "); Serial.print(exptime); Serial.print(" s"); } Serial.println("."); exposure(ReceivedData); } if (ReceivedData[0] == 's') { NoExposures = 0; numberstr = extractvalue(ReceivedData, 's'); NoExposures = numberstr.toInt(); numberstr = extractvalue(ReceivedData, 'i'); interval = numberstr.toDouble(); if (!interval) { interval = 1; } numberstr = extractvalue(ReceivedData, 'w'); wait = numberstr.toDouble(); Serial.print("Will make series of "); Serial.print(NoExposures); Serial.print(" images with interval "); Serial.print(interval); Serial.print(" s."); if (wait != 0) { Serial.print(" Wait "); Serial.print(wait); Serial.print(" s before start."); } numberstr = extractvalue(ReceivedData, 't'); exptime = numberstr.toDouble(); if (exptime) { Serial.print(" Exposure time "); Serial.print(exptime); Serial.println(" s."); } else Serial.println(); delay(wait * 1000); for (i = 0; i < NoExposures; i++) { Serial.print("Exposure no. "); Serial.print(i + 1); Serial.print(" from "); Serial.print(NoExposures); Serial.println("."); exposure(ReceivedData); delay(interval * 1000); } } } } String extractvalue(String inputstring, char parametr) { int character; String numberstr; for (character = 0; inputstring[character] != parametr && character < inputstring.length(); character++) { } if (inputstring[character] == parametr) { numberstr = ""; for (character++; character < inputstring.length() && inputstring[character] > 47 && inputstring[character] < 58 || inputstring[character] == '.'; character++) { numberstr = numberstr + inputstring[character]; } } return numberstr; } void exposure(String ReceivedData) { numberstr = extractvalue(ReceivedData, 't'); exptime = numberstr.toDouble(); if (exptime == 0) { exptime = 0.5; } digitalWrite(RelayPin, HIGH); delay(exptime * 1000); digitalWrite(RelayPin, LOW); } Niedawno jednak zmobilizowałem się do napisania własnej aplikacji mobilnej współpracującej z urządzeniem. Postanowiłem wykorzystać do tego środowisko Apache Cordova oraz plugin Cordova (PhoneGap) Plugin for Serial Communication over Bluetooth. Bluetooth.7zip Dlaczego taki pokraczny design? Czarne tło i czerwone napisy najmniej psują akomodację oka w ciemności. To bardzo istotne przy zastosowaniach astronomicznych. Dlaczego akurat przez wielu niezalecana Cordova? bardzo słabo znam JavaScript, a ten język jest mi potrzebny (w przeciwieństwie do Javy, w której powinno się pisać aplikacje na Androida) Cordova umożliwia bardzo proste tworzenie aplikacji DOKŁADNIE tak, jakbyśmy robili normalną stronę WWW aplikacja jest skrajnie prosta i mniejsza wydajność aplikacji hybrydowych względem natywnych nie powinna stanowić problemu Po instalacji środowiska Cordova (Windows, Linux) przechodzimy do rozpakowanego folderu z kodem programu. Możemy już skompilować program komendą cordova build. Plik instalacyjny .apk znajduje się w folderze Bluetooth/platforms/android/build/outputs. By go "usadowić na telefonie" musimy jednak wcześniej zezwolić na instalację aplikacji z nieznanych źródeł. Prawdopodobnie jeszcze łatwiej "wyklikamy" aplikację mobilną w MIT App Inventor. Fotografowanie zjawisk trwających kilka godzin stało się prostsze
  9. Jak powszechnie wiadomo, zdecydowana większość samochodów (nawet matizy) posiadają głośniki dość dobrej jakości. Oczywiście, kiedy mój znajomy pozbywał się samochodu na złom, musiałem coś z niego podebrać A oto prezentuję wam sterowniczek do głośników samochodowych DIY. Mogę też wspomnieć, że jest to mój pierwszy projekt nieoparty na mikrokontrolerze (więc dość tani). Funkcjonalność Urządzenie świetnie się nadaje na imprezy - potrzebuje dość dużo prądu, podpinamy się bezprzewodowo za pomocą bluetootha, no i wzmacniacz generuje dobre basy Całość zamyka się w małej obudowie Z23, z wyprowadzonymi złączami głośnikowymi i zasilaniem. Nie chciałem dodawać przycisków, gdyż na chwilę obecną wydawało mi się to zbędne. Urządzenie niestety wymaga aż 2 zasilaczy - 12v i 5v (obniżone do 3,3v za pomocą AMS1117), z powodu tzw. pętli mas, która zakłócała działanie układu BT, BK8000L. Sygnał audio wzmacnia PAM8610, wzmacniacz 2x15W przy impedancji 4ohm. Do wzmacniacza podłączyłem też niezależny, programowy przełącznik mute. Jak wyżej wspomniałem, do urządzenia łączymy się np. telefonem, i możemy bez problemu puścić muzykę z youtuba. Budowa Stabilizator wraz z modułem BT umieściłem na dwustronnej płytce prototypowej, zasilacz wlutowałem na stałe. Wyprowadziłem sygnały L, P i GND a resztę owinąłem taśmą kaptonową. Do wzmacniacza podłączyłem 12V bezpośrednio z zasilacza, przycisk mute do specjalnych wyprowadzeń na płytce, wyjścia podłączyłem do gniazd. Oczywiście całość w kaptonie - ochrona przed zwarciem. Później nożykiem wyrzeźbiłem w obudowie otwory na złącza, wkręciłem wszystko i zamknąłem. Efekty Na zdjęciu podłączyłem głośniki z koreańskiego samochodu Ssang Yong, o dość niskiej impedancji oraz 3 membranami. Całość połączyłem calkiem grubym kablem głośnikowym 1,5mm2. Dźwięk - czysty, basy - mocne, czyli zadanie zaliczone W przyszłości, kiedy znajdę czas (szkoła... ) na pewno pobawię się komendami AT, wydrukuję nową obudowę i dodam przyciski. Postaram się też zasilić całość 1 zasilaczem - jeżeli coś jeszcze będę modyfikował, dam znać. Na specjalną prośbę mogę wysłać filmik prezentujący działanie głośników. Pozdrawiam, Leoneq :3
  10. Witam Serdecznie, jestem nowicjuszem i proszę o pmoc. Po podłączeniu Telefonu z Androidem*dowolnego) przez bluetooth mam opcję połączeń przychodzących i wychodzących. Mogę ustawić tylko połączenia wychodzące i ustawi mi się np port com 11 a przychodzących już nie ustawię ponieważ pewnie android nie obsługuję takiej opcji. (testowałem kiedyś b2710 solid i tam mogę to ustawić bez problemu ale to już inna bajka) streszczając Czy jest możliwość połączenia się przez bluetooth za pomocą Arduino? żeby móc ustawić te połączenia w aplikacji na komputerze żeby był np com 12? dla mnie to czarna magia i się na tym nie znam dziękuję z góry?
  11. Cześć! Realizuje bezprzewodową komunikacje po protokole Modbus RTU pomiędzy PC, a Robotem i mam pytanie : jeżeli Master generuje ramkę(adres urządzenia + kod funkcji(0x03 odczyt n rejestrów) + adresy n - rejestrów + liczba rejestrów + suma_kontrolna) do SLAVE (STM32f103vct6) to... JAKI podać adres rejestru z mikrokontrolera pod, którym jest jakaś dana np. 2 bajtowa ? Przykład o co chodzi : tworzę tablice przechowującą n dwóbajtowych(np.int16_t) elementów i chciałbym w zapytaniu MASTERA podać adres np. pierwszej komórki, pytanie jaki ???? jak zadeklarować tablice w języku C w programie robota by jej adres tj. adres pierwszej komórki był stały i znany dla MASTERA(zakładam, że utworzę taką tablicę i sprawdzę np. za pomocą terminala adres pierwszej komórki &tab[0] , by potem wykorzystać ją dla informacji dla MASTERA)???? Z góry dzięki, za pomoc i proszę o pytania jeśli coś niejasno opisałem !!!
×
×
  • Utwórz nowe...