Maple Mini + NRF24L01 + OLED -дисплей + ina 219 + джойстик

Рикардо-Рейс
Ср 21 марта 2018 г., 13:26
привет!
В этом посте я постараюсь показать вам, как я создал простой пульт дистанционного управления (POC), который позволяет общаться в обоих направлениях, если вы заметите что -то не так, есть другой подход, которым вы хотели бы поделиться, или у вас есть какие -либо вопросы Что касается реализации, пожалуйста, опубликуйте, у меня, вероятно, есть чему поучиться на ней.
Практический проект, который я буду включать, это ровер дистанционное управление, с телеметрией, отправленной с Rover, к контролю, и от контроля на Rover будут указаны/путевые точки/GPS координаты для «Следуй за мной».. POC действительно включает в себя только общение, с некоторым базовым отображением обратной связи джойстика и управления светодиодом, используя компоненты, перечисленные здесь:
2x Maple Mini
2x NRF24L01
2x джойстик (Thumbsticks)
2x OLED -дисплей (SSD 1306)
1x ina219 (совершенно не требуется для этого конкретного проекта, но я поместил его на одну схему, может быть интересно посмотреть, что такое потребление)

Cuircuit довольно легко собрать, с обеих сторон я использовал одинаковые связи, за исключением INA219, так как у меня сейчас есть один:
OLED -дисплей - подключен к I2C1
INA219 - подключен к I2C1 (адрес отличается от OLED -дисплея, так что, не беспокойтесь)
NRF24L01 - подключен к SPI1 с: 3 - CE, 7 - CSN, 1 - IRQ
Джойстик - Z - 9, x - 10, y - 11 (в моем случае я переключил x на Y, так как ориентация моих джойстиков привела к этой ориентации)
Светодиод - ну, это на борту, PIN 33.
DSC_0004.jpg
DSC_0004.JPG (108.08 киб) просмотрено 1125 раз

Zoomx
Ср 21 марта 2018 г. 13:36
Спасибо, что поделились!

Рикардо-Рейс
Ср 21 марта 2018 13:57
[Zoomx - Ср 21 марта 2018 г. 13:36] - Спасибо, что поделились!
;) добро пожаловать

Стивестронг
Ср 21 марта 2018 г. 14:01
[Zoomx - Ср 21 марта 2018 г. 13:36] - Спасибо, что поделились!
+1

Racemaniac
Ср 21 марта 2018 г. 14:45
[Стивестронг - Ср 21 марта 2018 г. 14:01] -
[Zoomx - Ср 21 марта 2018 г. 13:36] - Спасибо, что поделились!
+1
+ ++1

Рикардо-Рейс
Чт 22 марта 2018 12:55
Интересно, если кто -нибудь из вас, ребята, использовал эти модули, видел какую -либо библиотеку для них, которая на самом деле реализует трубы, чтобы мы могли отправить более 32 баллов данных.. Модули, кажется, подчиняют 6 труб, и, если я не ошибаюсь, у Enrib Lib ничего нет в этом.

Mrburnette
Чт 22 марта 2018 г., 3:18
[Рикардо-Рейс - Чт 22 марта 2018 г. 12:55] - Интересно, если кто -нибудь из вас, ребята, использовал эти модули, видел какую -либо библиотеку для них, которая на самом деле реализует трубы, чтобы мы могли отправить более 32 баллов данных.. Модули, кажется, подчиняют 6 труб, и, если я не ошибаюсь, у Enrib Lib ничего нет в этом.
Эти инструкции охватывают основы, я не знаю, сколько усилий потребуется, чтобы перенести это в STM32.
http: // www.Инструменты.com/id/nrf24l0 ... R-NetWork/

Поиск в Google показывает небольшие результаты. https: // www.Google.com/search?&q = arduin ... Ulti+трубы

Луча

Zoomx
Чт 22 марта 2018 г. 8:57 утра
[Рикардо-Рейс - Чт 22 марта 2018 г. 12:55] - Интересно, если кто -нибудь из вас, ребята, использовал эти модули, видел какую -либо библиотеку для них, которая на самом деле реализует трубы, чтобы мы могли отправить более 32 баллов данных.. Модули, кажется, подчиняют 6 труб, и, если я не ошибаюсь, у Enrib Lib ничего нет в этом.
Среди библиотек, сделанных RF24 (это имя пользователя!) на GitHub для модулей NRF24L01 есть один RF24Audio, которые потоковые данные/аудио между двумя модулями. Я считаю, что это может быть полезно.
https: // github.com/nrf24/rf24audio
Другие библиотеки тоже интересны.

На форуме Arduino вместо этого есть стартовые примеры Post, сделанные Robin2
https: // форум.Ардуино.CC/INDEX.PHP?Тема = 421081.0

Рикардо-Рейс
Чт 22 марта 2018 г. 14:26
@mrbrunette, я был на этой первой ссылке бесчисленное количество раз.. Это, конечно же, поработает, но я искал либера. - Я знаю, что вы не заинтересованы в этом подходе, но это тот, который подходит для моих ограничений, так как я не могу создавать либера. может что -то для меня, чтобы поработать.

@zoomx, это вещи, которые я пробовал раньше с Arduino, в разных проектах, и да, супер интересные вещи.. Есть тонны крутых вещей, которые можно сделать с этими модулями.. В конце концов я вернемся к этим проектам для MM, если я заставлю его работать правильно..

Найдено здесь на форуме еще один подход к модулям RF24, в которой есть своего рода портированная и переименованная библиотека, которая может привести меня к чему -то..
Снова ложился спать очень поздно, сразу после того, как удалось прорезать код, используемый в этом посте ( ViewTopic.PHP?f = 15&t = 317&hilit = rf24&начало = 40 ) и заставить модули общаться в одну сторону.. Это многообещающе, так как LIB переносится из LIB NRF24, которую я знал и использовал раньше для Arduino. он также реализует трубы, которые будут очень полезны для этого проекта..

(Кстати, когда я говорю Project, это просто хобби -проекты, над которыми я работаю)

Рикардо-Рейс
Пт 23 марта 2018 г., 14:30
привет!
Обновление статуса: используя библиотеку, которая была связана в приведенном выше посте, я теперь могу общаться в обоих направлениях, используя трубы, в примере, который я собираюсь показать вам, я использую 3 трубы и одну программу для обрабатывать оба отправителя&приемник, для простоты, но как только он вырастет, я, вероятно, разделяю оба, чтобы избежать нагрузки бесполезного кода на каждом конце.

Одна вещь, которую я продолжал замечать, это то, что модули продолжают сбрасывать соединение, но я сузил это до двух вещей: конденсатор 100 UF между VCC/GND на модулях, и проводка - если я коснулся проводов, соединение восстанавливается и все работает хорошо.

На этот раз, на схемах, я решил использовать два джойстика, OLED и NRF24L01 на одном конце, и просто OLED и NRF24L01 на другом. все еще Maple Mini с обеих сторон.

Теперь код (не стесняйтесь добавлять предложения, если вы заметите, что я делаю что -то не так в нем - я бы очень признателен):
#include #include #include #define OLED_RESET 4 Adafruit_SSD1306 display(OLED_RESET); const uint64_t pipes[3] = { 0xF0F0F0F0E1LL, 0xF0F0F0F0D2LL, 0xF0F0F0F0D4LL }; RF24 radio(3, 7); boolean isRC = true; // true for one end, false for the other - THIS MUST BE CHANGED OTHERWISE THEY'RE BOTH SET TO DO THE SAME! // Structure for the joysticks struct joystick { int x; int y; bool z; }; joystick right; joystick left; /**************************************************/ void setup(){ // zz pins from joysticks pinMode(12, INPUT_PULLUP); pinMode(13, INPUT_PULLUP); // initialize display display.begin(SSD1306_SWITCHCAPVCC, 0x3C); display.clearDisplay(); display.display(); display.setTextColor(WHITE); display.setTextSize(1); // Set up radio module radio.begin(); radio.setDataRate(RF24_1MBPS); // Both endpoints must have this set the same radio.setAutoAck(false); // Either endpoint can set to false to disable ACKs radio.setPALevel(RF24_PA_MAX); // Power amplifier level. Also LOW,MED,HIGH (default is HIGH) radio.printDetails(); } /**************************************************/ void handleRC(){ char test[32]=""; radio.openReadingPipe(1,pipes[2]); radio.startListening(); if ( radio.available() ) { radio.read(&test, sizeof(test)); } radio.stopListening(); display.println(""); display.print("-> P1:"); display.print(sizeof(right)); display.print(" P2:"); display.println(sizeof(left)); right.x = analogRead(8); right.y = analogRead(9); right.z = digitalRead(12); left.x = analogRead(10); left.y = analogRead(11); left.z = digitalRead(13); radio.openWritingPipe(pipes[0]); radio.write(&right, sizeof(right)); display.print("-> X:"); display.print(right.x); display.print(" Y:"); display.print(right.y); display.print(" Z:"); display.println(right.z); radio.openWritingPipe(pipes[1]); radio.write(&left, sizeof(left)); display.print("-> X:"); display.print(left.x); display.print(" Y:"); display.print(left.y); display.print(" Z:"); display.println(left.z); display.print("<- P1:"); display.println(sizeof(test)); display.print("<- MSG:"); display.println(test); radio.startListening(); } /**************************************************/ void handleRover(){ radio.openReadingPipe(1,pipes[0]); radio.openReadingPipe(2,pipes[1]); radio.startListening(); if ( radio.available() ) { radio.read(&right, sizeof(right)); radio.read(&left, sizeof(left)); display.println(""); display.print("<- P1:"); display.print(sizeof(right)); display.print(" P2:"); display.println(sizeof(left)); display.print("<- X:"); display.print(right.x); display.print(" Y:"); display.print(right.y); display.print(" Z:"); display.println(right.z); display.print("<- X:"); display.print(left.x); display.print(" Y:"); display.print(left.y); display.print(" Z:"); display.println(left.z); } radio.stopListening(); char test[]="TEST!"; radio.openWritingPipe(pipes[2]); radio.write(&test, sizeof(test)); display.print("-> P1:"); display.println(sizeof(test)); display.print("-> MSG:"); display.println(test); radio.startListening(); } /**************************************************/ void loop(){ display.clearDisplay(); display.setCursor(0,0); display.print("This is the "); if(isRC){ display.println("RC!"); handleRC(); } else { display.println("Rover!"); handleRover(); } display.display(); }

Рикардо-Рейс
Пт 23 марта 2018 г. 14:35
[Рикардо-Рейс - Пт 23 марта 2018 г., 14:30] - привет!
Обновление статуса: используя библиотеку, которая была связана в приведенном выше посте, я теперь могу общаться в обоих направлениях, используя трубы, в примере, который я собираюсь показать вам, я использую 3 трубы и одну программу для обрабатывать оба отправителя&приемник, для простоты, но как только он вырастет, я, вероятно, разделяю оба, чтобы избежать нагрузки бесполезного кода на каждом конце.
ой! Забыли упомянуть, но это легко заметить из кода - я также использую структуры для обработки данных джойстиков. очень полезно при написании/чтении данных в трубы..

Mrburnette
Пт 23 марта 2018 г., 16:04
Очень хорошая эволюция.
Я думаю, что вы можете недооценить свою способность автора библиотеки.

Луча

Рикардо-Рейс
Пт 23 марта 2018 г., 16:25
[Mrburnette - Пт 23 марта 2018 г., 16:04] - Очень хорошая эволюция.
Я думаю, что вы можете недооценить свою способность автора библиотеки.

Луча
Спасибо, Рэй.
С наставничеством/руководством я был бы в порядке с этим.. Но самостоятельно, это как быть в темноте с фонаря.. Я вижу маленькие кусочки, но не ясно, что делать.. :)

Интересно, есть ли более поздний порт.. Я вижу, что LIB продолжает получать обновления, но не уверен, что есть что -то для MM:
https: // github.com/nrf24/rf24
Документация здесь была хорошим руководством:
http: // tmrh20.GitHub.io/rf24/

Mrburnette
Пт 23 марта 2018 г., 16:29
[Рикардо-Рейс - Чт 22 марта 2018 г. 14:26] - @mrbrunette, я был на этой первой ссылке бесчисленное количество раз.. Это, конечно же, поработает, но я искал либера. - Я знаю, что вы не заинтересованы в этом подходе, но это тот, который подходит для моих ограничений, так как я не могу создавать либера. может что -то для меня, чтобы поработать.
<...>
Я думаю, что мои «лайки и антипатии» совершенно не имеют отношения к хобби -проекту. Я думаю больше о разработке и кодировании от «основания» для потенциальных коммерческих проектов; Таким образом, избегая каких -либо проблем с лицензией и гарантируя, что библиотека обеспечивает чистые и четко понятные функции и наклоняется без большого «пуха."Тогда эта библиотека функций (ы) включена непосредственно в папку Sketch. Один теперь отделил код эскиза Arduino от сторонней библиотеки (IES). Это просто умно, так как ардуиноид всегда жалуется на обновление библиотек.

IMO, даже если вы используете стороннюю LIB в проекте хобби, библиотека должна быть поглощена в папке для изоляции для изоляции ... Эффективное создание снижения всего проекта в одном месте ... Очень простой в использовании Zip для архивирования папки проекта для целей списка и резервного копирования. Поскольку я публикую глупые маленькие проекты, это также отличный способ распространения кода, поскольку мне не нужно объяснять читателю, что они должны установить эту библиотеку или эту библиотечную версию и т. Д.


Луча

Рикардо-Рейс
Пт 23 марта 2018 г., 16:38
[Mrburnette - Пт 23 марта 2018 г. 16:29] - Я думаю, что мои «лайки и антипатии» совершенно не имеют отношения к хобби -проекту. Я думаю больше о разработке и кодировании от «основания» для потенциальных коммерческих проектов; Таким образом, избегая каких -либо проблем с лицензией и гарантируя, что библиотека обеспечивает чистые и четко понятные функции и наклоняется без большого «пуха."Тогда эта библиотека функций (ы) включена непосредственно в папку Sketch. Один теперь отделил код эскиза Arduino от сторонней библиотеки (IES). Это просто умно, так как ардуиноид всегда жалуется на обновление библиотек.

IMO, даже если вы используете стороннюю LIB в проекте хобби, библиотека должна быть поглощена в папке для изоляции для изоляции ... Эффективное создание снижения всего проекта в одном месте ... Очень простой в использовании Zip для архивирования папки проекта для целей списка и резервного копирования. Поскольку я публикую глупые маленькие проекты, это также отличный способ распространения кода, поскольку мне не нужно объяснять читателю, что они должны установить эту библиотеку или эту библиотечную версию и т. Д.
Они уверены, что актуальны. Некоторые LIBS настолько наполнены таким большим количеством вещей, которые я даже не использую, и в этих случаях это, безусловно, имеет смысл (даже для меня) смотреть на то, что можно забрать, делая их чистыми и легче. Для меньших микрофонов иногда важно иметь возможность даже соответствовать коду в маленьком пространстве, которое у них есть (например, Arduino - OLED и GPS LIBS, и вы едва можете двигаться, чтобы сделать что -либо еще). Но для меня это была одна из причин попробовать ММ.

Идея сохранить молнию всего проекта+LIB очень полезна - долгое время использовала его. Даже есть некоторые из версий Alfa Arduino IDE, и это пригодится довольно много раз. :)

Mrburnette
Пт 23 марта 2018 г., 18:50
Просто для удовольствия от этого ... Я агрегировал эскиз NRF24L01, RF24_STM32, ADAFRIT_GFX, код ADAFRIT_SSD1306 и файлы GFXFONT в один многотатный проект Arduino. ZIP был слишком большой, чтобы загрузить, но изменения очень незначительные:

в основном для #include <библиотека.час> Просто переодеться в библиотеку #include ".час"
Например: #include "RF24_STM32.h" #include "Adafruit_SSD1306.h"

Рикардо-Рейс
Сб 24 марта 2018 г. 14:53
[Mrburnette - Пт 23 марта 2018 г. 18:50] - Просто для удовольствия от этого ...
(...)
Теперь вы в состоянии взломать, как и с любыми/всеми файлами в проекте. :ржу не могу:
Кажется, мне придется попробовать.. Я не могу сказать «нет» после такого толчка.. :ржу не могу:

OV7670, Generic STM32F103RC и ILI9341 Дисплей