Автор Тема: Arduino UNO WiFi проблем ("WiFi shield not present")  (Прочетена 15115 пъти)

mat

  • Новодошъл
  • *****
  • Публикации: 5
    • Профил
Arduino UNO WiFi проблем ("WiFi shield not present")
« -: Февруари 20, 2017, 08:05:31 pm »
Преди няколко дни си закупих Arduino UNO WiFi (http://www.arduino.org/products/boards/arduino-uno-wifi). Абсолютно нов съм.

Вече три дни не мога да го пусна. Изчетох целия интернет и не и не.

Какво правя:

Свързах го към мрежата. Зададох му IP (направих всичко написано тук: http://www.arduino.org/learning/getting-started/getting-started-with-arduino-uno-wifi).
Пингва се. Отваря се страницата му за настройки от браузър. Превключил съм го в WiFi Mode STA.
Всичко е перфектно, но като заредя коя да е от примерните програми за работа с WiFi, програмата стига до тук:

if (WiFi.status() == WL_NO_SHIELD) {
  Serial.println("WiFi shield not present");
  while (true);

И ми изкарва съобщението "WiFi shield not present".
Наистина се побърках!
Моля ви някой да ми каже къде бъркам.

Рутерът е настроен на WPA2 Personal с парола. Пробвах с два рутера, да не би да е от него, но не.

Крайната ми цел е да направя WiFiServer скеч, с който да реализирам Tcp връзка и да получавам данни от I/O-тата по мрежата на всяка секунда. Не се интересувам от Web историите (не ми вършат работа).


mat

  • Новодошъл
  • *****
  • Публикации: 5
    • Профил
Re: Arduino UNO WiFi проблем ("WiFi shield not present")
« Отговор #1 -: Февруари 21, 2017, 06:56:33 pm »
До колкото разбрах, тази библиотека, която ползвам - WiFi не е за този контролер, а тази, която е за него (UnoWiFiDevEd) не е довършена - не предлага Tcp комуникация на този етап.
Има ли начин да получавам данни от Arduino UNO WiFi по подобие на Tcp?

yasko

  • Administrator
  • *****
  • Публикации: 484
    • Профил
Re: Arduino UNO WiFi проблем ("WiFi shield not present")
« Отговор #2 -: Февруари 21, 2017, 11:44:26 pm »
Здравей,

Доколкото разбирам искаш Ардуиното да е сървър, да направиш TCP връзка към него и да получаваш информция за входно-изходните портове на Ардуино?
Ще ползваш ли някакъв протокол от по-високо ниво за предаване на на данните по TCP връзката?
Поддръжката на TCP/IP комуникация е базова функционалност и трябва да е реализирана.  Ако всек пак няма TCP, може да ползваш UDP  връзка за предаване на данните.
Важно е да се изясни коя библиотека за кой чип. Ако можеш дай  линкове към въпросните библиотеки и хардуер.
Ясен Паунски,  гр.София, 39 г.

mat

  • Новодошъл
  • *****
  • Публикации: 5
    • Профил
Re: Arduino UNO WiFi проблем ("WiFi shield not present")
« Отговор #3 -: Февруари 22, 2017, 11:44:40 pm »
Точно така - искам да направя Tcp сървър в контролера и да предавам състоянието на входовете и изходите, а и на няколко вътрешни променливи към TcpClient написан на C# или C++.

Няма да ползвам никакви протоколи от по-високо ниво - чиста Tcp сокет връзка искам. Искам като се случи някакво събитие в контролера, той да предаде по Tcp някаква информация. Например ще чета един от аналоговите входове, ще правя някакво усредняване на стойностите - например ще изчислявам средната стойност за една минута и в края на минутата ще изпращам тази средна стойност по Tcp-то.
Ако отсреща има закачен клиент (а то ще има - C# програмата), той ще получи тези данни и ще прави каквото трябва с тях.
Съответно само когато се промени състояние на някой от цифровите изходи - само тогава (ивентно) това състояние ще се изпрати към Tcp клиента.

С UDP не съм работил и не знам дали ми върши работа. С Tcp имам много опит.

Контролера ми е Arduino UNO WiFi (http://www.arduino.org/products/boards/arduino-uno-wifi).

Въпросната библиотека, която сега я пишат и още не е довършена и която ЩЕ има Tcp поддръжка някой ден е тази: http://www.arduino.org/learning/tutorials/boards-tutorials/content/arduino-uno-wifi-tutorial
Това по-точно са примери за използване на вече направената част от нея. Самата библиотека се казва UnoWiFiDevEd.

Това го пише на разни места:
Instead if you are using the Arduino IDE 1.8.x then download the UNOWiFiDev.Edition library from Library Manager and modify the code, replacing #include <ArduinoWiFi.h> with #include <UnoWiFiDevEd.h>

Това е форумът, в който хората се възмущават как може да се продава този контролер, а софтуерът за него още да не е готов:
http://www.arduino.org/forums/uno/arduino-uno-wifi-arduinowifi-library-incomplete-540

Там има и един, който се казва GeelHaarMonster, който обяснява как може проблемът да се реши (временно) с RestServer.
Аз взех, че го разбрах и го направих и тръгна. Използвах този пример за RestServer:
http://www.arduino.org/learning/tutorials/boards-tutorials/restserver

Това е нещо като Web сървър, който чака някой да подаде заявка към него - все едно да пуснеш браузъра и да отвориш примерен линк:
192.168.1.100/arduino/digital/13
и в браузъра се отваря страница, в която пише състоянието на избрания цифров/аналогов вход/изход.
Само че аз не го отварям в браузър, а си направих една малка програмка, която имитира браузър, но вместо да покаже получената страница, взима данните и прави каквото иска с тях. Май не го обясних много добре...

Проблемът е, че така се губи ивентното предаване на данни от контролера към клиента. По този начин клиентът трябва периодично да казва на контролера "дай ми данните" и той да ги дава (подобно на Modbus). Ако не намеря друго решение ще го правя така, докато напишат Tcp-то. Но не ми харесва тази идея...


yasko

  • Administrator
  • *****
  • Публикации: 484
    • Профил
Re: Arduino UNO WiFi проблем ("WiFi shield not present")
« Отговор #4 -: Февруари 26, 2017, 11:10:17 am »
Така  като гледам тази библиотеки и примерите са направени за комуникация на по високо ниво от TCP/IP сокети, които са ти необходими на теб.
Очевидно целта е да може  с един клик да се подкара примерно уеб сървър и други шарени неща.
Имаш да се заровиш софтуер и да си направиш библиотека за TCP връзка сам. Очевидно след като има уеб сървър, то въпросния чип ESP8266 със сигурност поддържа и TCP сокети.
Другия вариант е да смениш платформата и да намериш нещо, което има нормален TCP/IP стек и библиотека за него.
Разбира се остава и варианта да ползваш това, което има. Както си писал въпросния RestServer върши работа, макара и не много елегантно.
Гледам че Ардуино има библиотека за MQTT протокол - https://en.wikipedia.org/wiki/MQTT. Не го познавам, но разглеждал ли си го дали не ти върши работа?
Ясен Паунски,  гр.София, 39 г.

mat

  • Новодошъл
  • *****
  • Публикации: 5
    • Профил
Re: Arduino UNO WiFi проблем ("WiFi shield not present")
« Отговор #5 -: Февруари 26, 2017, 02:19:16 pm »
И аз това не разбирам - има Rest протокол, който е на базата на Tcp, а няма чисто Tcp...
Ами примирих се вече и реших да ползвам RestServer, че даже като се замислих може би ще ми върши добра работа и изобщо няма да се занимавам с Tcp, дори и когато го направят.

Но въпреки всичко ще ми е от ползва, ако някой ми даде повече яснота около това, как да подкарам чисто Tcp на това чудо.
Точно на това чудо - Arduino UNO WiFi (http://www.arduino.org/products/boards/arduino-uno-wifi). Поради разни причини трябва да работя точно с тази платформа и при мен не стои въпросът за друга.

А този MQTT протокол... Доколкото разбирам, някъде на някой компютър трябва да имам работещ MQ (Message Queue) сървър. След това да настроя Ардуиното да се свързва с този сървър и след това то да изпраща данните във вид на някакви съобщения към него. На друг компютър пък ще работи моят софтуер, който вместо да се свързва директно с Ардуиното, ще се "абонира" за съобщенията от този MQ сървър и ще ги получава от него. Ако това е идеята - не ме устройва. Твърде сложно става и се намесва посреднически софтуер (MQ сървър), който кой го знае колко е надежден...

Нямам си идея как да изпрограмирам собствено Tcp на това Ардуино...

mat

  • Новодошъл
  • *****
  • Публикации: 5
    • Профил
Re: Arduino UNO WiFi проблем ("WiFi shield not present")
« Отговор #6 -: Февруари 27, 2017, 10:21:17 pm »
Аз съм голям новобранец... ;D

Оказа се, че на порт 23 на Ардуиното има постоянно работещ Tcp сървър, който използва TELNET protocol (https://en.wikipedia.org/wiki/Telnet).
Този протокол е на базата на Tcp и най-общо казано е обикновен Tcp протокол, по който се предават стрингове. Поне аз така го разбрах.

Кънекнах се с моя Tcp клиент и о - чудо - работи.

На Ардуиното трябва да работи следната програмка (в опростен вид):

#include <UnoWiFiDevEd.h>

void setup() {
    Wifi.begin();
}

void loop() {
  if (Wifi.available()){
    Wifi.print(Wifi.read()); // Така връща на Tcp клиента всичко, което дойде от него.
  }
  delay(50);
}

Wifi.read() чете един символ (ако има такъв), идващ от някой от Tcp клиентите (може да са повече от един - пробвах), а Wifi.print(...) съответно изпраща един или повече символи по Tcp канала към всички клиенти (изпраща до 80 символа наведнъж и ако съобщението е по-дълго го изпраща на части).
Изключително просто! На мен ми върши перфектна работа!

Иска да кажа отново защо не успях от първия път. Отначало на тази платформа се опитвах да използвам стандартната WiFi библиотека (https://www.arduino.cc/en/Reference/WiFi). После разбрах, че тя не само че не е за него, но дори е САМО за така наречените shield-ове - допълнителни платки, които се нанизват на Арнуидото и му дават допълнителни възможности. Знам, че някой ми се присмива сега, ама поне да обясня на такива като мен :)

Докато си правих тестове с тази WiFi библиотека видях, че мога да се кънеквам с Tcp клиент на порт 23 (а също и на порт 80), но нищо не се случваше и затова забравих за това. Докато днес не попаднах на този много хубав пример: https://github.com/arduino-org/arduino-library-arduino-wifi/blob/master/examples/Tools/Wifi2Serial/Wifi2Serial.ino, където се казва:

...connect to the WiFi via a telnet client at the address 192.168.240.1:23 where 192.168.240.1 is the IP of your  Arduino Uno Wifi and 23 is the port.

И го пробвах и стана - явно си има постоянно отворен Tcp канал и явно всички го знаят, щом в мрежата не открих нищо, като търсех за Tcp връзка.

Сега се чудя какво има на порт 80 :)