Skocz do zawartości

Uruchamianie programu przy starcie - Ardruino Leonardo


tomikula

Pomocna odpowiedź

Cześć,

Na wstępie poinformuję, że to moje początki w zabawie z Ardruino 😉

Buduję już sobie programiki według kursu Forbota i jakoś idzie.

Mam płytkę Ardruino Leonardo ETH +PoE.

Niestety mam pytanie, na które odpowiedzi nie mogę się doszukać - a przynajmniej nie widzę jasnej odpowiedzi.

Co mam zrobić, aby uruchomić program przy starcie urządzenia

Kompiluje program, wgrywam i działa (wszystko przez port microUSB). Gdy rozłączam się i odpalam urządzenie poprzez PoE, program już nie działa. Z tego co wyczytałem to chyba powinienem mieć bootloader? Jeżeli tak to jak to ogarnąć, jak to wgrać (na pewno potrzeba programatora, ale może macie jakąś instrukcję)? Chyba, że źle myślę...

Pomóżcie

Link do komentarza
Share on other sites

Jeśli proces programowania przebiegł bezbłędnie i "program działa", to jest już w pamięci FLASH procesora i będzie działał w przyszłości. Warunkiem jest poprawne zasilenie procesora i ew. pozostałych układów z nim współpracujących. Bootloader i tak już jest w procesorze i to rzeczywiście on "odpala" Twój program gdy zauważy, że przez parę sekund po włączeniu zasilania nie ma kontaktu z programem avrdude na PC.

Mój pierwszy strzał, to Twoje PoE - widocznie nie działa. To nie jest prosta bateria tylko interfejs z negocjacjami więc może być tak, że obie strony (zasilacz i płytka Arduino) nie dogadują się wzajemnie i nie dostajesz mocy po Ethernecie. Przede wszystkim zmierz napięcie na Vcc procesora oraz napisz, czy widzisz w ogóle jakiekolwiek oznaki zadziałania płytki/programu - zapalają się jakieś diody itp? Jak poznajesz, że program działa? Do czego to podpinasz? Co jest źródłem mocy w Twoim PoE? Prosty "wstrzykiwacz" typu przejściówka z zasilacza na RJ45 czy jakieś mądrzejsze urządzenie sieciowe? Czy przez ten sam przewód/gniazdo zasilałeś cokolwiek innego wyposażonego w PoE?

Może być też tak, że Twój program jest (nieumyślnie) napisany w ten sposób, że np. wymaga podpięcia pod USB (np. Serial/UART na coś czeka) i to w tym tkwi przyczyna niedziałania po zmianie źródła zasilania. Ponieważ nic nie wiemy, możemy tylko zgadywać.

Link do komentarza
Share on other sites

Mój kod poniżej.

Faktycznie jeżeli wrzucę w pamięć przykładowy program "Blik" to po wyłączeniu urządzenia i podłączeniu przez PoE działa mruganie diodą. Źródłem mojego PoE jest przełącznik D-Link z 802.3af. Możliwe, masz rację, że problem może być z Serial, lecz podpowiedz mi gdzie popełniam błąd? Faktycznie w późniejszym czasie nie będę potrzebował podłączenia po Serial tylko ETH (telnet).

#include <SPI.h>
#include <Ethernet.h>

 boolean stan = 0;
 String odebraneDane = "";
 byte mac[] = { 0x90, 0xA2, 0xDA, 0x10, 0x7B, 0x6F };
 boolean powitanie = false;
 char odebraneDaneEth;

 IPAddress myDns(10,30,0,1);
 IPAddress gateway(10,30,0,11);
 IPAddress subnet(255, 255, 0, 0);
 IPAddress ip(10,30,40,60);
 EthernetServer server(23);

void setup() {
 Serial.begin(9600); //Uruchomienie komunikacji
 while (!Serial) {;}
 pinMode(7, INPUT_PULLUP); //Przycisk jako wejście
 pinMode(A5, OUTPUT); //Konfiguracja A5 jako wyjście
 Ethernet.begin(mac, ip, myDns, gateway, subnet);\
 Serial.print("Adres IP: ");
 ip = Ethernet.localIP();
 for (byte thisByte = 0; thisByte < 4; thisByte++) {
   // print the value of each byte of the IP address:
   Serial.print(ip[thisByte], DEC);
   Serial.print(".");
 }
 Serial.println();
 server.begin();
}

void loop() {
 EthernetClient client = server.available();
 if (digitalRead(7) == LOW) { //Jeśli przycisk wciśnięty
   stan = !stan; // Zmiana zmiennej na przeciwną
   Serial.println(stan); // Wyrzucenie informacji do konsoli
   digitalWrite(A5, stan); //Włącz diodę
   delay(1000);
 }
 if(Serial.available() > 0) { //Czy Arduino odebrano dane z COM
   odebraneDane = Serial.readStringUntil('\n'); //Jeśli tak, to odczytaj je do znaku końca linii i zapisz w zmiennej odebraneDane
   Serial.print(odebraneDane + " COM"); // Pokazuje na COM co zostało wpisane
   Serial.println();
 }
 if (client) { // Cy ktos podłaczył sie do telnetu
   if (!powitanie) {
     Serial.println("Podlaczony klient telnet");
     client.println("Siema!");
     powitanie = true;
   }
   odebraneDaneEth = client.read();
   Serial.print(odebraneDaneEth);
 }
 if(odebraneDane == "start" || odebraneDaneEth == 's')
   while(digitalRead(7) == HIGH) {
     stan = !stan;
     digitalWrite(A5, stan);
     delay(1000);
   }
   Serial.println("???");
   odebraneDane = "stop";
   odebraneDaneEth = 't';
   stan = 1 ;
 }
}
Link do komentarza
Share on other sites

W Leonardo interfejs szeregowy do PC jest wirtualny. Tak naprawdę cała transmisja idzie przecież przez USB i jeśli ono nie działa bo np. odpiąłeś kabel, to Serial.begin() nigdy się nie uda, nie mówiąc już o Serial.print(). Albo wywal używanie Serial zupełnie, albo zrób timeout na inicjalizację tego interfejsu. Gdy się nie powiedzie (sprawdź gdzie obecny program utyka) przez np. 2 sekundy to znaczy, że USB nie ma i program musi sobie radzić bez niego.

Zawsze też możesz (np. do uruchamiania kodu lub podglądu komunikatów o stanie programu) użyć Serial1. To w Leonardo działa na prawdziwym UART i jeśli podepniesz jego piny Tx/Rx do jakiegoś konwertera UART/USB, to będziesz miał komunikację a jednocześnie program nie będzie głupiał gdy ten konwerter odepniesz, bo sprzętowy UART zawsze coś wyśle, nawet w powietrze.

Poczytaj to:

https://www.arduino.cc/en/Guide/ArduinoLeonardoMicro?from=Guide.ArduinoLeonardo#toc10

  • Lubię! 1
Link do komentarza
Share on other sites

Zarejestruj się lub zaloguj, aby ukryć tę reklamę.
Zarejestruj się lub zaloguj, aby ukryć tę reklamę.

jlcpcb.jpg

jlcpcb.jpg

Produkcja i montaż PCB - wybierz sprawdzone PCBWay!
   • Darmowe płytki dla studentów i projektów non-profit
   • Tylko 5$ za 10 prototypów PCB w 24 godziny
   • Usługa projektowania PCB na zlecenie
   • Montaż PCB od 30$ + bezpłatna dostawa i szablony
   • Darmowe narzędzie do podglądu plików Gerber
Zobacz również » Film z fabryki PCBWay

Bądź aktywny - zaloguj się lub utwórz konto!

Tylko zarejestrowani użytkownicy mogą komentować zawartość tej strony

Utwórz konto w ~20 sekund!

Zarejestruj nowe konto, to proste!

Zarejestruj się »

Zaloguj się

Posiadasz własne konto? Użyj go!

Zaloguj się »
×
×
  • Utwórz nowe...

Ważne informacje

Ta strona używa ciasteczek (cookies), dzięki którym może działać lepiej. Więcej na ten temat znajdziesz w Polityce Prywatności.