• Уважаемые посетители сайта esp8266.ru!
    Мы отказались от размещения рекламы на страницах форума для большего комфорта пользователей.
    Вы можете оказать посильную поддержку администрации форума. Данные средства пойдут на оплату услуг облачных провайдеров для сайта esp8266.ru
  • Система автоматизации с открытым исходным кодом на базе 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-ам...
 
Последнее редактирование:
Сверху Снизу