• Система автоматизации с открытым исходным кодом на базе esp8266/esp32 микроконтроллеров и приложения IoT Manager. Наша группа в Telegram

Arduino для RTL8710.

pvvx

Активный участник сообщества
Скоро выйдет официальный 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).


Поддерживаемые модули:
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 или основную прошивку...).
 
Последнее редактирование:

Shara

New member
А WIFI на RTL тоже анаально-огорожен и RTOS крутится сбоку-припёку как в ESP8266?
 

Юрий Ботов

Moderator
Команда форума
А у меня чего то не идет... Arduino IDE 1.6.5. На всех примерах ошибки компиляции.
 

pvvx

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

pvvx

Активный участник сообщества
После перезаписи 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 или резисторы и шлейф длинный)...
Код:
===== Enter Image 1.5 ====
Img2 Sign: RTKWin, InfaStart @ 0x10006049
===== Enter Image 2 ====
Initializing I2C devices...
Testing device connections...
a/g:    -1324   -13072  9720    95      9       247
a/g:    -1360   -13112  9684    96      32      216
a/g:    -1340   -13084  9728    86      13      270
a/g:    -1320   -13048  9720    109     -16     196
a/g:    -1288   -13052  9680    76      27      208
a/g:    -1344   -13016  9788    93      21      219
a/g:    -1368   -13100  9652    93      24      247
....
Скетч использует 47 660 байт (13%) памяти устройства. Всего доступно 352 256 байт.
Интересно, как затягивает ACK MPU9250 уже на HS режиме I2C (1 MHz):
I2с_MPU9250_1MHz.gif
 
Последнее редактирование:

pvvx

Активный участник сообщества
В общем с "запуском" 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-ов:

Файл перенес в общий архив, в шапке темы, в связи с обновлением.
 
Последнее редактирование:

pvvx

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

Не понятно, почему так отвечает https: / / esp8266.ru/forum
Код:
#include <WiFi.h>
//char ssid[] = "yourNetwork"; //  your network SSID (name)
//char pass[] = "secretPassword";    // your network password (use for WPA, or use as key for WEP)
#include <myAP.h> // там прописаны pass и ssid и #define password pass для быстрой замены в разных примерах...
int keyIndex = 0;            // your network key Index number (needed only for WEP)

int status = WL_IDLE_STATUS;

char server[] = "esp8266.ru"; // "github.com"; // "esp8266.ru";//  "yandex.ru"; //"www.google.com"; // "github.com";// name address for Google (using DNS)
//unsigned char test_client_key[] = "";   //For the usage of verifying client
//unsigned char test_client_cert[] = "";  //For the usage of verifying client
//unsigned char test_ca_cert[] = "";      //For the usage of verifying server

WiFiSSLClient client;

extern "C" void sys_info(void);

void setup() {
  //Initialize serial and wait for port to open:
  Serial.begin(9600);
  while (!Serial) {
    ; // wait for serial port to connect. Needed for native USB port only
  }

  // check for the presence of the shield:
  if (WiFi.status() == WL_NO_SHIELD) {
    Serial.println("WiFi shield not present");
    // don't continue:
    while (true);
  }

  // attempt to connect to Wifi network:
  while (status != WL_CONNECTED) {
    Serial.print("Attempting to connect to SSID: ");
    Serial.println(ssid);
    // Connect to WPA/WPA2 network. Change this line if using open or WEP network:
    status = WiFi.begin(ssid,pass);

    // wait 0.1 seconds for connection:
    delay(100);
  }
  Serial.println("\r\nConnected to wifi");
  printWifiStatus();

  Serial.println("\nStarting connection to server...");
  // if you get a connection, report back via serial:
  if (client.connect(server, 443)) { //client.connect(server, 443, test_ca_cert, test_client_cert, test_client_key)
    Serial.println("connected to server");
    // Make a HTTP request:
    client.println("GET /forum HTTP/1.1"); //  client.println("GET /search?q=realtek HTTP/1.0");
    client.print("Host: "); client.println(server);
//    client.println("Host: www.google.com");
    client.println("Connection: close");
    client.println();
  }
  else
  Serial.println("connected to server failed"); 
}

void loop() {
  // if there are incoming bytes available
  // from the server, read them and print them:
  while (client.available()) {
    char c = client.read();
    Serial.write(c);
  }

  // if the server's disconnected, stop the client:
  if (!client.connected()) {
    Serial.println();
    Serial.println("disconnecting from server.");
    client.stop();
    sys_info();
    Serial.println("End.");
    // do nothing forevermore:
    while (true);
  }
}

void printWifiStatus() {
  // print the SSID of the network you're attached to:
  Serial.print("SSID: ");
  Serial.println(WiFi.SSID());

  // print your WiFi shield's IP address:
  IPAddress ip = WiFi.localIP();
  Serial.print("IP Address: ");
  Serial.println(ip);

    // print your MAC address:
  byte mac[6];
  WiFi.macAddress(mac);
  Serial.print("MAC address: ");
  Serial.print(mac[0], HEX);
  Serial.print(":");
  Serial.print(mac[1], HEX);
  Serial.print(":");
  Serial.print(mac[2], HEX);
  Serial.print(":");
  Serial.print(mac[3], HEX);
  Serial.print(":");
  Serial.print(mac[4], HEX);
  Serial.print(":");
  Serial.println(mac[5], HEX);

  // print the received signal strength:
  long rssi = WiFi.RSSI();
  Serial.print("signal strength (RSSI):");
  Serial.print(rssi);
  Serial.println(" dBm");
}
Код:
Initializing WIFI ...
WIFI initialized
Attempting to connect to SSID: ********
RTL8195A[Driver]: set ssid [********]
RTL8195A[Driver]: start auth to **:**:**:**:**:**
RTL8195A[Driver]: auth success, start assoc
RTL8195A[Driver]: association success(res=2)
RTL8195A[Driver]: set pairwise key to hw: alg:4(WEP40-1 WEP104-5 TKIP-2 AES-4)
RTL8195A[Driver]: set group key to hw: alg:4(WEP40-1 WEP104-5 TKIP-2 AES-4) keyid:2
Interface 0 IP address : 192.168.1.122
Connected to wifi
SSID: ********
IP Address: 192.168.1.122
MAC address: 0:F8:87:11:0:12
signal strength (RSSI):-28 dBm

Starting connection to server...
connected to server
HTTP/1.1 301 Moved Permanently
Server: nginx
Date: Sat, 12 Nov 2016 09:34:11 GMT
Content-Type: text/html
Location: https://esp8266.ru/forum/
Transfer-Encoding: chunked
Connection: close
Strict-Transport-Security: max-age=15768000

b2
<html>
<head><title>301 Moved Permanently</title></head>
<body bgcolor="white">
<center><h1>301 Moved Permanently</h1></center>
<hr><center>nginx</center>
</body>
</html>

0


disconnecting from server.

CLK CPU         166666666 Hz
RAM heap        48976 bytes
TCM heap        27928 bytes
End.
 
Последнее редактирование:

Alexey N

Member
Осталось еще написать кучу примеров "для самых маленьких", как у ЕСП, и можно нести в массы :)
 

pvvx

Активный участник сообщества
Осталось еще написать кучу примеров "для самых маленьких", как у ЕСП, и можно нести в массы :)
Большинство примеров от ESP8266 работают, но надо удалять в начале каждого "кекса" #include <ESP8266WiFi.h> (исправлять на #include <WiFi.h> - я уже замучался, думаю что проще один раз переименовать WiFi.h в ESP8266WiFi.h в либе для RTL :) ).
Самое сложное в этом деле - нарисовать картинку модуля c проводками и подписями, куда и какой номер порта торчит...
Совместимость у RTL модулей с ESP8266 в Arduino односторонняя - RTL замещает ESP практически везде, а наоборот - нет.
 
Последнее редактирование:

goodwin

Member
Это очень хорошие новости, хотя я тоже не поклонник всяческих "дуин". Ибо, какой бы отличный не был чип, важно его продвижение "в массы".
 

pvvx

Активный участник сообщества
Это очень хорошие новости, хотя я тоже не поклонник всяческих "дуин". Ибо, какой бы отличный не был чип, важно его продвижение "в массы".
Тут дело такое, не простое... Народ уже "выразился", что RTOS - это очень сложно. По этому не обязательно в массы - можно и расслоить - детяммороженоебабецветыглядинеперепутайкутузов..
 

pvvx

Активный участник сообщества
Arduino RTL00MP3 lib Stereo Out
Arduino_RTL00MP3_lib.zip (226Кб) - перенесено в общий архив в шапке темы, в связи с обновлением.
Код:
#include <WiFi.h>
#include "RTL00MP3.h"

char ssid[] = "yourNetwork"; //  your network SSID (name)
char pass[] = "password";    // your network password (use for WPA, or use as key for WEP)

void setup() {
  WiFi.begin(ssid, pass);
}

void loop() {
  if(WiFi.status() == WL_CONNECTED) {
    if(RTLmp3.status() == 0) {
      Serial.println("\nCONNECTED");
      RTLmp3.begin("icecast.omroep.nl/3fm-sb-mp3", 80);
    }
  }
  else  RTLmp3.end();
  delay(50);
}


Запись с выхода OUT1/2 на саунд в комп fm3.wma для примерной оценки качества выхода...
 
Последнее редактирование:

Сергей_Ф

Moderator
Команда форума
@pvvx а не нужно на ауты по конденсатору на 0.01-0.1 мкФ навесить? По идеи должно сгладить вч помехи от семплирования.
 
Последнее редактирование:

pvvx

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

Сергей_Ф

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

pvvx

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

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

Сергей_Ф

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

pvvx

Активный участник сообщества
В данном случае мы имеем абсолютно неправильный аудиосигнал - ещё и ноль сдвинут, огибающая получается от 0 до +3,3, а не -\+3,3. По хорошему, его надо бы и отфильтровать и сдвинуть на 1,65В - будет -\+1,65 В. Фильтрация механическая - не самая лучшая идея, имхо. Там множество других проблем вылазит, но это уже из области hi-fi.
Он там и не 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 кодека в таком формате есть - там немного переписать...
@pvvx Вас не переубедить :). Придется самому проверить, когда придут.
Это сложно, т.к. повязался со звуковой аппаратурой уже с 1982 точно... И как итог - не воспринимаю всякие MP3 и прочее, с выходами в один бит ( это практически любой современный аудио чип) в понятие hi-fi...
Как-бы есть класс "пищалок" - о них тут и разговор. Что от них требовать? :)

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

Да, и в связи с этим, наличием DMA, в оф. Arduino к RTL ошибка:
Код:
void SPIClass::transfer(byte _pin, void *_buf, size_t _count, SPITransferMode _mode)
{
    if (_pin != pinSS) {
        pinMode(_pin, OUTPUT);
        digitalWrite(_pin, 0);
    }

    spi_master_write_stream( (spi_t *)pSpiMaster , (char *)_buf, (uint32_t)_count );
    while(spi_busy((spi_t *)pSpiMaster)); // <--- ожидание вывода блока по DMA перед переключением pinSS.


    if (_pin != pinSS && _mode == SPI_LAST) {
        digitalWrite(_pin, 1);
    }
}
Экранчик 128x160 полностью переписывается из буфера c использованием DMA за 19 ms. Значит имеем 50 кадров в секунду и полностью свободное время для CPU для распаковки видео изображения... Прикидка показала, что RTL потянет не сильно больший видео поток с HTTP...
Для картинок и экрана побольше что-то уже есть: GitHub - Bodmer/JPEGDecoder: A JPEG decoder library
Там требуется минимум правок для адаптации к RTL-ам...
 
Последнее редактирование:
Сверху Снизу