Скрыть объявление
На нашем форуме недоступен просмотр изображений для неавторизованных пользователей. Если Вы уже зарегистрированы на нашем форуме, то можете войти. Если у Вас еще нет аккаунта, мы будем рады, если Вы к нам присоединитесь. Зарегистрироваться Вы можете здесь.

Arduino для RTL8710.

Тема в разделе "Realtek - описание, документация и обсуждение", создана пользователем pvvx, 5 ноя 2016.

  1. pvvx

    pvvx Активный участник сообщества

    Сообщения:
    8.126
    Симпатии:
    1.244
    Скоро выйдет официальный Arduino для RTL8710. -> Arduino/hardware_v2/variants at master · Ameba8195/Arduino · GitHub (он ориентирован на платы Ameba с аппаратным mbed-dap отладчиком). Но скорее всего нормальной поддержки RTL871x от них не дождемся.

    ESP8266 теперь на свалку... Пирожки (скетчи) под RTOS всегда вкуснее :p :)

    Моя тестовая свалка RtlDuino для модулей c RTL8710AF, RTL8711AF,RTL8711AM,RTL8195AM c Jtag типа SEGGER или STLink:
    GitHub - pvvx/RtlDuino: Arduino module RTL00(RTL8710AF), F11AMIM13 (RTL8711AM)
    В дальнейшем будет поддерживаться и DAPLink на STM32F0xx/F103C8 (китайские клоны STLink).
    [​IMG]
    [​IMG]
    Поддерживаемые модули:
    RTL00(RTL8710AF), F11AMIM13 (RTL8711AM), F11AFIM13-B1 (RTL8711AF)
    PADI (RTL8710AF), F10AFIM13-B1 (RTL8710AF), TinyCon2005-A-BE (RTL8711AF),
    WFM-400 (RTL8711AM), WFM-410 (RTL8711AF), WFM-250 (RTL8195AM),
    AW-CU238, AW-CU239 (RTL8711AM), AW-CU245, AW-CU245, AW-CU245 (RTL8711AM/RTL8195AM/RTL8711AF),
    WG6611 (RTL8711AM), RAK473 (RTL8711AM), RAK474, RAK476 (RTL8711AF), ...

    В репо добавлены разные дополнительные библиотеки...
    WiFiSSLClient и WebSocketClient работает с любыми HTTPS сайтами без подстановки ключей, как это требуется для ESP8266 (см. пример WiFiSSLClient и WebSocketClient)

    Программирование модуля RTL00 из Arduino по WiFi.

    Методы Upload Method
    • JLink RAM - загрузка для теста в RAM
    • JLink IMG - запись в flash в область image2 (не OTA, с адреса Flash: 0xB000)
    • JLink OTA - запись в flash в OTA область (с адреса Flash: 0x80000)
    • Network OTA - загрузка в flash в OTA область через WiFi (до этого требуется прошить пример ota_basic.ino)
    Тест скорости приема по UDP и TCP (iperf.exe)
    Потребление модулем RTL00 в RtlDuino
    Пример NFC на RTL00 (RTL8710AF)

    Пример с bitband I/O

    Прошивка OTA для RtlDuino + AT V2.2 для восстановления, если модуль пришел с кривой китайской прошивкой. А так-же если виснет при разных типах загрузок (в RAM или не переключается по пину PC_1 на OTA или основную прошивку...).
     
    Последнее редактирование: 11 июл 2017
    ru-sh, Tomat7, kissste и ещё 1-му нравится это.
  2. pvvx

    pvvx Активный участник сообщества

    Сообщения:
    8.126
    Симпатии:
    1.244
    Последнее редактирование: 11 июл 2017
    Makc1806 и Сергей_Ф нравится это.
  3. Shara

    Shara Читатель

    Сообщения:
    40
    Симпатии:
    6
    А WIFI на RTL тоже анаально-огорожен и RTOS крутится сбоку-припёку как в ESP8266?
     
  4. Юрий Ботов

    Юрий Ботов Moderator Команда форума

    Сообщения:
    911
    Симпатии:
    159
    А у меня чего то не идет... Arduino IDE 1.6.5. На всех примерах ошибки компиляции.
     
  5. pvvx

    pvvx Активный участник сообщества

    Сообщения:
    8.126
    Симпатии:
    1.244
    WiFi отгорожен полностью, с семафорами и т.д. Т.е. всё учтено для многозадачности работы устройств. В ESP8266 RTOS пока прикручен кое-как, тем более в Arduino для ESP8266 не используется RTOS.
    Я с Arduino не дружу. Ставил по описанию последнюю версию. Пока нашел, что беда c I2C, или я не знаю как в Arduino его инициализировать. Там 3 объекта Wire - Wire, Wire1, Wire2. Ни один из них по умолчанию не торчит в RTL00 на выводы. При изменении в конце Wire.cpp:
    Код (C):
    1. // HW: I2C1
    2. //TwoWire Wire  = TwoWire(PD_7, PD_6);
    3. TwoWire Wire  = TwoWire(PC_4, PC_5);
    всё равно I2C не работает. Надо что-то ещё менять.
    Примеры с NFC - работают после удаления
    Код (C):
    1. #if defined(BOARD_RTL8710)
    2. //#error "RTL8710 do not support NFC"
    3. #endif
    в NfcTag.cpp и NfcTag.h.
    и припаивания катушки к выводам чипа в модуле RTL00. NFC и RTL00
    Телефон отрабатывает при подносе все команды.
    ---
    Примеры с MQTT тоже работают.
    Не рабочими остаются пока примеры с I/O, т.к. в RTL8710 нет ADC, а либа с I/O не переписана.
     
    Последнее редактирование: 9 ноя 2016
  6. pvvx

    pvvx Активный участник сообщества

    Сообщения:
    8.126
    Симпатии:
    1.244
    После перезаписи hal_i2c.c, hal_pinmux.c, i2c_api.c, rtl8195a_i2c.c + hal_efuse.c из моей модифицированной SDK в папку cores/arduino заработал аппаратный I2C (выводы PC4/PC5). Тестировал с примером с MPU6050_raw. I2C работает до 3-х MHz с платой GY-91 (используются резисторы на ней, больше 3MHz или не тянет чип MPU9250 или резисторы и шлейф длинный)...
    Код (Text):
    1. ===== Enter Image 1.5 ====
    2. Img2 Sign: RTKWin, InfaStart @ 0x10006049
    3. ===== Enter Image 2 ====
    4. Initializing I2C devices...
    5. Testing device connections...
    6. a/g:    -1324   -13072  9720    95      9       247
    7. a/g:    -1360   -13112  9684    96      32      216
    8. a/g:    -1340   -13084  9728    86      13      270
    9. a/g:    -1320   -13048  9720    109     -16     196
    10. a/g:    -1288   -13052  9680    76      27      208
    11. a/g:    -1344   -13016  9788    93      21      219
    12. a/g:    -1368   -13100  9652    93      24      247
    13. ....
    Скетч использует 47 660 байт (13%) памяти устройства. Всего доступно 352 256 байт.
    Интересно, как затягивает ACK MPU9250 уже на HS режиме I2C (1 MHz):
    I2с_MPU9250_1MHz.gif
     
    Последнее редактирование: 10 ноя 2016
  7. pvvx

    pvvx Активный участник сообщества

    Сообщения:
    8.126
    Симпатии:
    1.244
    В общем с "запуском" Arduino закончил.
    С помощью описанных "модификаций" работает всё, что есть и торчит из чипа RTL8710 и лезет в его память.
    I/O + IRQ, PWM, I2C, UART, SPI, NFC, HTTP, MQTT, MDNS, ...
    Для оф. Arduino к RTL-ам пока не сделано подключение к внешней AP с фиксированным IP у модуля. Т.е. нет управления DHCP для соединения в Arduino. Скече-писатели обычно в такое не лезут.
    20161111_113731.jpg
    ST7735 на RTL00
    Модификация либы ST7735 на аппаратный SPI RTL-ов:

    Файл перенес в общий архив, в шапке темы, в связи с обновлением.
     
    Последнее редактирование: 21 ноя 2016
    Shara и kissste нравится это.
  8. pvvx

    pvvx Активный участник сообщества

    Сообщения:
    8.126
    Симпатии:
    1.244
    Вроде собрал полную подборку "патча" для Arduino к RTL8710 в первом посту темы...

    Не понятно, почему так отвечает https: / / esp8266.ru/forum
    WiFiSSLClient.ino (раскрыть)
    Код (C):
    1. #include <WiFi.h>
    2. //char ssid[] = "yourNetwork"; //  your network SSID (name)
    3. //char pass[] = "secretPassword";    // your network password (use for WPA, or use as key for WEP)
    4. #include <myAP.h> // там прописаны pass и ssid и #define password pass для быстрой замены в разных примерах...
    5. int keyIndex = 0;            // your network key Index number (needed only for WEP)
    6.  
    7. int status = WL_IDLE_STATUS;
    8.  
    9. char server[] = "esp8266.ru"; // "github.com"; // "esp8266.ru";//  "yandex.ru"; //"www.google.com"; // "github.com";// name address for Google (using DNS)
    10. //unsigned char test_client_key[] = "";   //For the usage of verifying client
    11. //unsigned char test_client_cert[] = "";  //For the usage of verifying client
    12. //unsigned char test_ca_cert[] = "";      //For the usage of verifying server
    13.  
    14. WiFiSSLClient client;
    15.  
    16. extern "C" void sys_info(void);
    17.  
    18. void setup() {
    19.   //Initialize serial and wait for port to open:
    20.   Serial.begin(9600);
    21.   while (!Serial) {
    22.     ; // wait for serial port to connect. Needed for native USB port only
    23.   }
    24.  
    25.   // check for the presence of the shield:
    26.   if (WiFi.status() == WL_NO_SHIELD) {
    27.     Serial.println("WiFi shield not present");
    28.     // don't continue:
    29.     while (true);
    30.   }
    31.  
    32.   // attempt to connect to Wifi network:
    33.   while (status != WL_CONNECTED) {
    34.     Serial.print("Attempting to connect to SSID: ");
    35.     Serial.println(ssid);
    36.     // Connect to WPA/WPA2 network. Change this line if using open or WEP network:
    37.     status = WiFi.begin(ssid,pass);
    38.  
    39.     // wait 0.1 seconds for connection:
    40.     delay(100);
    41.   }
    42.   Serial.println("\r\nConnected to wifi");
    43.   printWifiStatus();
    44.  
    45.   Serial.println("\nStarting connection to server...");
    46.   // if you get a connection, report back via serial:
    47.   if (client.connect(server, 443)) { //client.connect(server, 443, test_ca_cert, test_client_cert, test_client_key)
    48.     Serial.println("connected to server");
    49.     // Make a HTTP request:
    50.     client.println("GET /forum HTTP/1.1"); //  client.println("GET /search?q=realtek HTTP/1.0");
    51.     client.print("Host: "); client.println(server);
    52. //    client.println("Host: www.google.com");
    53.     client.println("Connection: close");
    54.     client.println();
    55.   }
    56.   else
    57.   Serial.println("connected to server failed");
    58. }
    59.  
    60. void loop() {
    61.   // if there are incoming bytes available
    62.   // from the server, read them and print them:
    63.   while (client.available()) {
    64.     char c = client.read();
    65.     Serial.write(c);
    66.   }
    67.  
    68.   // if the server's disconnected, stop the client:
    69.   if (!client.connected()) {
    70.     Serial.println();
    71.     Serial.println("disconnecting from server.");
    72.     client.stop();
    73.     sys_info();
    74.     Serial.println("End.");
    75.     // do nothing forevermore:
    76.     while (true);
    77.   }
    78. }
    79.  
    80. void printWifiStatus() {
    81.   // print the SSID of the network you're attached to:
    82.   Serial.print("SSID: ");
    83.   Serial.println(WiFi.SSID());
    84.  
    85.   // print your WiFi shield's IP address:
    86.   IPAddress ip = WiFi.localIP();
    87.   Serial.print("IP Address: ");
    88.   Serial.println(ip);
    89.  
    90.     // print your MAC address:
    91.   byte mac[6];
    92.   WiFi.macAddress(mac);
    93.   Serial.print("MAC address: ");
    94.   Serial.print(mac[0], HEX);
    95.   Serial.print(":");
    96.   Serial.print(mac[1], HEX);
    97.   Serial.print(":");
    98.   Serial.print(mac[2], HEX);
    99.   Serial.print(":");
    100.   Serial.print(mac[3], HEX);
    101.   Serial.print(":");
    102.   Serial.print(mac[4], HEX);
    103.   Serial.print(":");
    104.   Serial.println(mac[5], HEX);
    105.  
    106.   // print the received signal strength:
    107.   long rssi = WiFi.RSSI();
    108.   Serial.print("signal strength (RSSI):");
    109.   Serial.print(rssi);
    110.   Serial.println(" dBm");
    111. }

    Console log (раскрыть)
    Код (Text):
    1. Initializing WIFI ...
    2. WIFI initialized
    3. Attempting to connect to SSID: ********
    4. RTL8195A[Driver]: set ssid [********]
    5. RTL8195A[Driver]: start auth to **:**:**:**:**:**
    6. RTL8195A[Driver]: auth success, start assoc
    7. RTL8195A[Driver]: association success(res=2)
    8. RTL8195A[Driver]: set pairwise key to hw: alg:4(WEP40-1 WEP104-5 TKIP-2 AES-4)
    9. RTL8195A[Driver]: set group key to hw: alg:4(WEP40-1 WEP104-5 TKIP-2 AES-4) keyid:2
    10. Interface 0 IP address : 192.168.1.122
    11. Connected to wifi
    12. SSID: ********
    13. IP Address: 192.168.1.122
    14. MAC address: 0:F8:87:11:0:12
    15. signal strength (RSSI):-28 dBm
    16.  
    17. Starting connection to server...
    18. connected to server
    19. HTTP/1.1 301 Moved Permanently
    20. Server: nginx
    21. Date: Sat, 12 Nov 2016 09:34:11 GMT
    22. Content-Type: text/html
    23. Location: https://esp8266.ru/forum/
    24. Transfer-Encoding: chunked
    25. Connection: close
    26. Strict-Transport-Security: max-age=15768000
    27.  
    28. b2
    29. <html>
    30. <head><title>301 Moved Permanently</title></head>
    31. <body bgcolor="white">
    32. <center><h1>301 Moved Permanently</h1></center>
    33. <hr><center>nginx</center>
    34. </body>
    35. </html>
    36.  
    37. 0
    38.  
    39.  
    40. disconnecting from server.
    41.  
    42. CLK CPU         166666666 Hz
    43. RAM heap        48976 bytes
    44. TCM heap        27928 bytes
    45. End.
     
    Последнее редактирование: 12 ноя 2016
    Сергей_Ф и Victor нравится это.
  9. Alexey N

    Alexey N Читатель

    Сообщения:
    108
    Симпатии:
    12
    Осталось еще написать кучу примеров "для самых маленьких", как у ЕСП, и можно нести в массы :)
     
    Makc1806 нравится это.
  10. pvvx

    pvvx Активный участник сообщества

    Сообщения:
    8.126
    Симпатии:
    1.244
    Большинство примеров от ESP8266 работают, но надо удалять в начале каждого "кекса" #include <ESP8266WiFi.h> (исправлять на #include <WiFi.h> - я уже замучался, думаю что проще один раз переименовать WiFi.h в ESP8266WiFi.h в либе для RTL :) ).
    Самое сложное в этом деле - нарисовать картинку модуля c проводками и подписями, куда и какой номер порта торчит...
    Совместимость у RTL модулей с ESP8266 в Arduino односторонняя - RTL замещает ESP практически везде, а наоборот - нет.
     
    Последнее редактирование: 12 ноя 2016
    Makc1806, Victor и Alexey N нравится это.
  11. goodwin

    goodwin Читатель

    Сообщения:
    123
    Симпатии:
    21
    Это очень хорошие новости, хотя я тоже не поклонник всяческих "дуин". Ибо, какой бы отличный не был чип, важно его продвижение "в массы".
     
  12. pvvx

    pvvx Активный участник сообщества

    Сообщения:
    8.126
    Симпатии:
    1.244
    Тут дело такое, не простое... Народ уже "выразился", что RTOS - это очень сложно. По этому не обязательно в массы - можно и расслоить - детяммороженоебабецветыглядинеперепутайкутузов..
     
    Юрий Ботов нравится это.
  13. pvvx

    pvvx Активный участник сообщества

    Сообщения:
    8.126
    Симпатии:
    1.244
    Arduino RTL00MP3 lib Stereo Out
    Arduino_RTL00MP3_lib.zip (226Кб) - перенесено в общий архив в шапке темы, в связи с обновлением.
    Код (C):
    1.  
    2. #include <WiFi.h>
    3. #include "RTL00MP3.h"
    4.  
    5. char ssid[] = "yourNetwork"; //  your network SSID (name)
    6. char pass[] = "password";    // your network password (use for WPA, or use as key for WEP)
    7.  
    8. void setup() {
    9.   WiFi.begin(ssid, pass);
    10. }
    11.  
    12. void loop() {
    13.   if(WiFi.status() == WL_CONNECTED) {
    14.     if(RTLmp3.status() == 0) {
    15.       Serial.println("\nCONNECTED");
    16.       RTLmp3.begin("icecast.omroep.nl/3fm-sb-mp3", 80);
    17.     }
    18.   }
    19.   else  RTLmp3.end();
    20.   delay(50);
    21. }
    [​IMG]

    Запись с выхода OUT1/2 на саунд в комп fm3.wma для примерной оценки качества выхода...
     
    Последнее редактирование: 23 ноя 2016
    Makc1806, Arthur, nicelight и 3 другим нравится это.
  14. Сергей_Ф

    Сергей_Ф Moderator Команда форума

    Сообщения:
    1.583
    Симпатии:
    166
    @pvvx а не нужно на ауты по конденсатору на 0.01-0.1 мкФ навесить? По идеи должно сгладить вч помехи от семплирования.
     
    Последнее редактирование: 14 ноя 2016
  15. pvvx

    pvvx Активный участник сообщества

    Сообщения:
    8.126
    Симпатии:
    1.244
    А зачем? Если далее включено что-то типа входа саунда компа (линейный вход) то он сам должен отфильтровать - без собственного фильтра ADC не работают.
    Если там поставить просто два транзистора на динамик через емкость, то динамик не умеет пищать на за 20 кГц - тяжелый он = механический фильтр. Так будет и лучше - не будет искажений типа "ступенька" - выходной каскад будет работать в ключевом режиме и не будет греться.
    А если уж ставить фильтр, то R-С не годится. Нужен большего порядка...
    И ущё - выход идет ШИМ и коррекции на R-С у него нет. В динамике ШИМ правильно работает на источник тока и C, а не R-C.
     
    Последнее редактирование: 14 ноя 2016
  16. Сергей_Ф

    Сергей_Ф Moderator Команда форума

    Сообщения:
    1.583
    Симпатии:
    166
    @pvvx если не сложно (я не могу, поскольку у меня пока нет RTL), проверьте. Обычно это приводит к существенному увеличению амплитуды поезного сигнала == громкости. Не буду утверждать со 100% уверенностью, но...
    Особенно когда транзисторы. Зачем им усиливать ВЧ? Пусть трудятся только на полезную нагрузку.
     
  17. pvvx

    pvvx Активный участник сообщества

    Сообщения:
    8.126
    Симпатии:
    1.244
    Вот они и будут трудиться только на полезную нагрузку - L динамика. И фильтр на нем лучше - большего порядка.
    Зачем линейный усилитель? Греться?
    Качество радиотрансляций в инет на MP3 48кГц x 2 канала = 96 кбит не особое и вытягивать там чего-то нет смысла.

    Там ещё что-то неверно сделал с коррекцией ухода частоты (синхронизацией передаваемого потока и выводом, иначе переполняются или возникают дыры, буфера...) ... Через пару часов сказывается :) Чинить лень. Я столько не слушаю радио.
     
    Последнее редактирование: 14 ноя 2016
  18. Сергей_Ф

    Сергей_Ф Moderator Команда форума

    Сообщения:
    1.583
    Симпатии:
    166
    @pvvx Вас не переубедить :). Придется самому проверить, когда придут.
    Оффтоп:
    В данном случае мы имеем абсолютно неправильный аудиосигнал - ещё и ноль сдвинут, огибающая получается от 0 до +3,3, а не -\+3,3. По хорошему, его надо бы и отфильтровать и сдвинуть на 1,65В - будет -\+1,65 В. Фильтрация механическая - не самая лучшая идея, имхо. Там множество других проблем вылазит, но это уже из области hi-fi.
     
  19. pvvx

    pvvx Активный участник сообщества

    Сообщения:
    8.126
    Симпатии:
    1.244
    Он там и не 0..3.3В. I2S передает 128 бит, а выводится всего 96. Т.е. идет поток по 24 бита c дырками на 8 бит, т.к. I2S в RTL не умеет гнать 32 бита на такой частоте - только 24. При 32 битах предельная частота вывода в 2 раза меньше.
    По этому нуль у выходного сигнала = 3.3*24/32/2.
    Для двух транзисторов в эмиттерном повторителе всё равно. Они включаются на динамик через электролит.
    О hi-fi разговор даже не идет - у нас всего 96 выходных значений. Правда с коррекцией + оверсамплинг и звучит неплохо (сравнивать с ESP8266 не стоит - там один шум :) ). Если надо лучше - ставьте 24-х битные DAC. Вывод c кодека в таком формате есть - там немного переписать...
    Это сложно, т.к. повязался со звуковой аппаратурой уже с 1982 точно... И как итог - не воспринимаю всякие MP3 и прочее, с выходами в один бит ( это практически любой современный аудио чип) в понятие hi-fi...
    Как-бы есть класс "пищалок" - о них тут и разговор. Что от них требовать? :)

    Я с kissste пробовал перекинуть выходы на большую частоту - на SPI выходы, но HAL в SDK не позволяет сделать безразрывный вывод (авто-переключение буферов DMA к нему не описано). А переписывать самому HAL уровень SPI только для данной задачи - лень. Цифровым устройствам это не мешает - длина буферов DMA у RTL-ов ограничена размерами памяти и каналов толпа, а не как у ESP - по десятку байт на фиксированные каналы к каждому устройству (да с закрытым описанием :) )...

    Да, и в связи с этим, наличием DMA, в оф. Arduino к RTL ошибка:
    Код (C):
    1.  
    2. void SPIClass::transfer(byte _pin, void *_buf, size_t _count, SPITransferMode _mode)
    3. {
    4.     if (_pin != pinSS) {
    5.         pinMode(_pin, OUTPUT);
    6.         digitalWrite(_pin, 0);
    7.     }
    8.  
    9.     spi_master_write_stream( (spi_t *)pSpiMaster , (char *)_buf, (uint32_t)_count );
    10.     while(spi_busy((spi_t *)pSpiMaster)); // <--- ожидание вывода блока по DMA перед переключением pinSS.
    11.  
    12.  
    13.     if (_pin != pinSS && _mode == SPI_LAST) {
    14.         digitalWrite(_pin, 1);
    15.     }
    16. }
    Экранчик 128x160 полностью переписывается из буфера c использованием DMA за 19 ms. Значит имеем 50 кадров в секунду и полностью свободное время для CPU для распаковки видео изображения... Прикидка показала, что RTL потянет не сильно больший видео поток с HTTP...
    Для картинок и экрана побольше что-то уже есть: GitHub - Bodmer/JPEGDecoder: A JPEG decoder library
    Там требуется минимум правок для адаптации к RTL-ам...
     
    Последнее редактирование: 15 ноя 2016
    Сергей_Ф нравится это.
  20. sharikov

    sharikov Авторитетный участник сообщества

    Сообщения:
    528
    Симпатии:
    48
    Под линуксом не ставится.
    Boards manager ругается "Tool ameba_tools is not available for your operating system"
     

Поделиться этой страницей