Сообщество - Arduino & Pi

Arduino & Pi

1 463 поста 20 778 подписчиков

Популярные теги в сообществе:

12

Поменял колёсико и аккумулятор

Заднее ведомое колёсико меня вообще не устраивало - робот застревал на порогах, страшно гремел и пугал кошку. Нашёл колесо от, опять-же, пылесоса. Но оно должно быть сильно утоплено в корпус. Быстренько соорудил модельку и напечатал крепление. Теперь всё устраивает ))

Кроме того, выяснилось, что power bank Xiaomi 20000mAh нифига не тянет одновременно включенную логику и лидар. Так только нагрузка на процессор Orange возрастает (я начинал стримить видео с камеры) - получаем просадку напряжения и зависания контроллеров.

Решил заменить на аккумулятор 12В, такой же, как для ходовой части. Тоже через DC-DC преобразователь. Теперь с этим тоже вроде всё хорошо - ещё одно улучшение аппаратной платформы.

Заодно подключил IMU (MPU6050) но пока софт под него не интегрировал. Наверное, это пойдёт уже вместе со SLAM, когда руки дойдут.

Больше информации в ТГ: https://t.me/robostroy

YouTube: https://www.youtube.com/@seko2k19

Показать полностью
39
Вопрос из ленты «Эксперты»

Вывод картинки с sd карты на экран

Привет! Мой первый проект, хочу попробовать сделать электронную фоторамку. Сейчас я пытаюсь вывести картинку с СД карты на экранчик. По отдельности и карта и экран работают. А вот вместе работать отказываются - функция read для чтения из файла всегда возвращает -1, а экран выводит какой-то мусор. Помогите, пожалуйста, разобраться

https://ideone.com/88vUtO

Так же столкнулся с ещё одной проблемой - SD.begin() возвращает false после рестарта скрипта, каждый раз приходится вытаскивать карту памяти и вставлять ее заново(.

Вывод картинки с sd карты на экран Вопрос, Спроси Пикабу

Так выглядит моя модель

UPD:

Спасибо всем за советы, но показать картинку таким способом у меня вышло(

Зато все получилось после подключения экранчика к software spi шине, хоть и скорость отрисовки при этом заметно упала. Но почему не получается нормально взаимодействовать с экранчиком и картой памяти в одной spi шине я так и не понял(

Показать полностью 1
70

Лидар подключен!

rViz2 показал, что облако точек наблюдается и коррелирует с внешним миром. Ещё есть подозрение, что я неправильно развернул лидар по курсу, может надо программно скорректировать угол.

В целом, можно записать в успех )) Лидар установлен, события идут в топик, видны подписчикам. Следующий этап - картография, навигация и избегание препятствий. Nav2, mapserver, сонар — много сложного, но интересного ))

Больше информации в ТГ: https://t.me/robostroy

YouTube: https://www.youtube.com/@seko2k19

Показать полностью
35

Двухканальный цифровой вольтметр с графиком и шкалой на Arduino

🧾 Описание проекта

Этот проект представляет собой двухканальный цифровой вольтметр на базе Arduino, предназначенный для одновременного измерения входного и выходного напряжения, а также отображения максимального зафиксированного значения и реального графика изменения напряжения во времени.

Двухканальный цифровой вольтметр с графиком и шкалой на Arduino Arduino, Радиолюбители, Электроника, Вольтметр, Амперметр, Мультиметр, Радиоэлектроника, Радиотехника, Хобби, Видео, YouTube, Длиннопост

Вольтметр отображает:

🟢 Входное напряжение (V In)

🔵 Выходное напряжение (V Out)

🔺 Максимальное выходное напряжение (V Max)

📉 График изменения выходного напряжения

📊 Вертикальную шкалу напряжения справа

Это отличный проект для начинающих радиолюбителей и разработчиков лабораторных блоков питания: он наглядно показывает работу стабилизаторов, поведение напряжения под нагрузкой и позволяет оценивать динамику процессов.

🔧 Используемые компоненты

Двухканальный цифровой вольтметр с графиком и шкалой на Arduino Arduino, Радиолюбители, Электроника, Вольтметр, Амперметр, Мультиметр, Радиоэлектроника, Радиотехника, Хобби, Видео, YouTube, Длиннопост

⚙️ Схема подключения

Двухканальный цифровой вольтметр с графиком и шкалой на Arduino Arduino, Радиолюбители, Электроника, Вольтметр, Амперметр, Мультиметр, Радиоэлектроника, Радиотехника, Хобби, Видео, YouTube, Длиннопост

🔌 Подключение компонентов

🖥️ OLED-дисплей:

GND → GND

VCC → 5V

SCL → A5

SDA → A4

🎛️ Измерение напряжений:

Arduino измеряет напряжения через аналоговые входы A0 и A1. Но напрямую подавать на них более 5 В опасно. Поэтому используются резистивные делители напряжения.

📥 Делитель для входного напряжения (V In → A0):

Верхний резистор: 40 кОм

Нижний резистор: 10 кОм

Входной сигнал подаётся на верхний резистор

Средняя точка подключается к A0

Позволяет измерять до 25 В

📤 Делитель для выходного напряжения (V Out → A1):

Верхний резистор: 40 кОм

Нижний резистор: 10 кОм

Средняя точка подключается к A1

Такой делитель даёт коэффициент ≈ 1/5, что позволяет измерять до 25 В

⚠️ Подбирайте резисторы с учётом нужного диапазона. Программа изначально рассчитана на вход 0–5 В, поэтому при использовании делителей нужно изменить формулу расчёта напряжения.

⚙️ Как работает программа

Программа построена на основе двух объектов класса VoltMeter, каждый из которых отвечает за измерение напряжения по одному из входов.

А также один экземпляр класса Oscilloscope (осциллограф)

📦 Смотри раздел "Скетч Arduino"

Основные этапы работы:

Измерение напряжений:

Выполняется analogRead() на пинах A0 и A1.

Полученные значения преобразуются в вольты: voltage = raw * (5.0 / 1023.0);

При необходимости можно умножать результат на коэффициент делителя, например voltage *= 2.0;

Отображение данных:

Все показания (V In, V Out, V Max) отображаются в верхней части дисплея крупным текстом.

Используется шрифт TextSize(1) для чёткости и экономии места.

Фиксация максимума:

В каждом измерении программа сравнивает текущее значение с предыдущим максимумом.

При нажатии на кнопку (подключенную к D2) максимум сбрасывается.

График напряжения:

Отдельный класс Oscilloscope сохраняет последние измерения в буфере.

В нижней части дисплея рисуется линия, отображающая изменение напряжения во времени.

График занимает 110 пикселей по горизонтали и не наезжает на шкалу.

Вертикальная шкала справа:

Сегментная шкала (10 делений) показывает текущий уровень выходного напряжения.

Обновляется при каждом цикле измерения.

🧠 Дисплей

Размещение основных блоков отображения на экране OLED дисплея

Отображение на дисплее

Программа строит интерфейс в несколько этапов:

Верхняя часть дисплея — отображает входное и максимальные значения напряжения

Средняя часть — напряжение на выходе блока питания.

Нижняя часть — график напряжения во времени, построенный с использованием массива graphBuffer[], в котором хранятся последние 128 измерений. Этот массив сдвигается каждый раз и отображается как ломаная линия, повторяя форму изменения напряжения.

Правая часть — визуальный уровень напряжения в виде сегментной шкалы, где каждый сегмент активен в зависимости от уровня сигнала.

Такой подход позволяет использовать OLED-дисплей максимально эффективно: информативно и красиво.

📜 Скетч Arduino

#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>

#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64
#define OLED_RESET -1

Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);

const int inputPin = A0; // Входное напряжение
const int outputPin = A1; // Выходное напряжение
const int resetButtonPin = 2; // Кнопка сброса максимума

#define GRAPH_HEIGHT 20
#define GRAPH_WIDTH 110 // Оставляем место справа под шкалу
uint8_t graphBuffer[GRAPH_WIDTH];

// Класс вольтметра
class VoltMeter {
private:
int pin;
float voltage;
float maxVoltage;

public:
VoltMeter(int analogInputPin) { // Кнструктор класса
pin = analogInputPin;
voltage = 0.0;
maxVoltage = 0.0;
}

void measure() { // Метод -измерение
int raw = analogRead(pin);
voltage = raw * (5.0 / 1023.0);
if (voltage > maxVoltage) {
maxVoltage = voltage;
}
}

void resetMax() { // Метод - сброс максимального значения
maxVoltage = voltage;
}

float getVoltage() { // Метод - получить измеренное напряжение
return voltage;
}

float getMax() { // Метод - получить максимальное напряжение
return maxVoltage;
}
};

// Класс осциллограф
class Oscilloscope {

public:
Oscilloscope() { // Кнструктор класса
// pin = analogInputPin;
}


void updateGraph(float voltage) {
for (int i = 0; i < GRAPH_WIDTH - 1; i++) {
graphBuffer[i] = graphBuffer[i + 1];
}
uint8_t newY = map(voltage * 100, 0, 500, 0, GRAPH_HEIGHT);
graphBuffer[GRAPH_WIDTH - 1] = newY;
}

void drawGraph() {
int baseY = SCREEN_HEIGHT - 1;
for (int x = 0; x < GRAPH_WIDTH - 1; x++) {
display.drawLine(x, baseY - graphBuffer[x], x + 1, baseY - graphBuffer[x + 1], SSD1306_WHITE);
}
}

void drawScale(float value) {
const int segments = 10;
const int startX = SCREEN_WIDTH - 10; // Правая сторона экрана
const int startY = 58;
const int segWidth = 8;
const int segHeight = 4;
const int gap = 2;

int activeSegments = map(value * 100, 0, 500, 0, segments);

for (int i = 0; i < segments; i++) {
int y = startY - i * (segHeight + gap);
if (i < activeSegments) {
display.fillRect(startX, y, segWidth, segHeight, SSD1306_WHITE);
} else {
display.drawRect(startX, y, segWidth, segHeight, SSD1306_WHITE);
}
}
}
};

VoltMeter vinMeter(inputPin); //Экземпляр класса вольтметр V In
VoltMeter voutMeter(outputPin); // Экземпляр класса вольтметр V Out
Oscilloscope oscill; //Экземпляр класса осциллограф

void setup() {
pinMode(resetButtonPin, INPUT_PULLUP);
display.begin(SSD1306_SWITCHCAPVCC, 0x3C);
display.clearDisplay();
display.setTextSize(1);
display.setTextColor(SSD1306_WHITE);
display.setCursor(10, 28);
display.println("Digital Voltmeter");
display.display();
delay(1500);
}

void loop() {
vinMeter.measure();
voutMeter.measure();

if (digitalRead(resetButtonPin) == LOW) {
vinMeter.resetMax();
voutMeter.resetMax();
delay(300);
}

float vin = vinMeter.getVoltage();
float vout = voutMeter.getVoltage();
float vmax = voutMeter.getMax();

oscill.updateGraph(vout);
display.clearDisplay();

display.setTextSize(1);
display.setCursor(0, 0);
display.print("V In: ");
display.print(vin, 2);
display.println(" V");

display.setCursor(0, 10);
display.print("V Max: ");
display.print(vmax, 2);
display.println(" V");

display.setCursor(0, 20);
display.print("V Out: ");
display.print(vout, 2);
display.println(" V");

oscill.drawGraph();
oscill.drawScale(vout);

display.display();
delay(200);
}

🧠 Советы и доработки

✅ Добавить коэффициент делителя прямо в класс VoltMeter, чтобы учесть масштабирование.

💾 Сохранять максимум в EEPROM, чтобы он не сбрасывался при перезагрузке.

🧲 Добавить третью строку: ток или мощность, если есть токовый шунт.

📈 Изменить масштаб графика для отображения высокого напряжения.

⚡ Применение

Настройка и тестирование лабораторных блоков питания.

Измерение и контроль напряжения в проектах Arduino.

Демонстрация работы стабилизаторов напряжения.

Учебные и демонстрационные стенды.

Показать полностью 2 1
13

Смонтировал лидар на робота, получил какие-то данные с него

Переделал схему питания, чтобы лидар можно было включать отдельно, по своей линии питания. У него потребление ~400мА, больше, чем вся остальная логика, включая Orange PI.

Собрал, включил. На python написал простейший скрптец, чтобы увидеть данные, которые он шлёт. Увидел ))

Следующий этап - подключение лидара к ROS2-ноде и визуализировать данные на RViz.

Больше информации в ТГ: https://t.me/robostroy

И как обычно, дублирую на других площадках:

RuTube: https://rutube.ru/video/ca1bca8be0d3b831236b22a71f80fdfa/

VK: https://vk.com/video-226966878_456239039

Показать полностью
18

Тестирую лидар для робота

Лидар с Алиэкспресса, от робота-пылесоса. Будет основой навигационной системы будущего робота. Целью теста было припаять нужные провода, проверить мотор и логику перед монтажём на платформу.

Подробно процесс стройки освещаю здесь: https://t.me/robostroy

и здесь: https://www.youtube.com/@seko2k19

Подписывайтесь, должно быть интересно!

Показать полностью
18

Строю робота на круглой платформе

Задумал построить нового робота на большой круглой платформе. Пока реализована сама платформа на двух мотор-колёсах, Orange PI Zero 2W, двух Arduino. До этого был опыт построения на базе черырёхколёсной машинки (мини-ровера), но там очень ограничено пространство.

В планах: лидар, камера+машинное зрение, сопряжение с LLM на большом компе.

Процесс стройки буду освещать здесь: https://t.me/robostroy

и здесь: https://www.youtube.com/@seko2k19

Подписывайтесь, должно быть интересно!

Показать полностью
33

Управление реле по UDP: Беспроводное решение с ESP8266, ESP32 и Easy HMI

Вы уже, наверное, в курсе, что Easy HMI получил поддержку беспроводной связи по UDP. Если нет, то ознакомьтесь с новыми возможностями тут. А так как есть беспроводной интерфейс, неплохо было бы сделать удаленное управление реле. Что, в свою очередь, позволит управлять светом, вытяжкой, вентилятором, чайником, кофемашиной, обогревателем и другими устройствами и приборами. Для реализации данной идеи можно использовать готовые модули на базе ESP32 и/или ESP8266. Я уже рассказывал про модуль ESP12F Relay X4 (LC-Relay-ESP12-4R-MV – по даташиту). Сегодня напишем код для управления данным модулем и также посмотрим, как можно управлять по UDP 2, 3, 5, 10 и даже 12 группами реле с одного сенсорного дисплея. Думаете, это невозможно реализовать? Давайте разберемся!

Код для модуля ESP12F Relay X4 (подойдет также для ESP8266, ESP32)

Управление 8–16 реле с сенсорного дисплея в Easy HMI и Arduino, ESP32.

Поддержка UDP в новой Easy HMI 0.1.2.

Показать полностью
Отличная работа, все прочитано!