У меня на сайте и на канале есть блок уроков по программированию Arduino с использованием симулятора, который входит в состав TinkerCad: Circuits Arduino. В данном симуляторе небольшая элементная база, а из микроконтроллеров доступны Arduino UNO, Attiny85 и ещё несколько малоизвестных. А хочется создавать проекты на ESP32, без ожидания долгой компиляции. Также последнее время становится популярным программирование на MicroPython Raspberry Pi Pico и ESP32. Всё это и многое другое есть в онлайн симуляторе wokwi. Создавать и проверять проекты можно без регистрации и в последствии поделиться ссылкой на свой проект. Невероятно полезно, не правда ли!?
Для того чтобы начать создавать свои проекты с использованием различных плат Arduino, Raspberry Pi Pico, ESP32, Attiny85 достаточно прейти на сайт wokwi.com и выбрать нужную плату для разработки.
Также можно производить разработку проектов на MicroPython с использованием следующих отладочных плат: Raspberry Pi Pico и ESP32.
Для того чтобы создать свой проект, необходимо выбрать отладочную плату. Для примера сделаю небольшой проект по управлению сервоприводом с помощью Arduino MEGA и потенциометра. Для этого нажимаем на отладочную плату на главной странице симулятора.
Откроется рабочая область. С левой стороны поля для написания кода и вкладка для редактирования внешнего вида проекта в формате json.
С левой стороны находится поле сборки электрической схемы, на которое размещена Arduino MEGA. Для того чтобы добавить нужные элементы, нажимаем на кнопку со знаком «Плюс». Откроется список с доступными элементами. Добавим на рабочее поле потенциометр и servo.
Теперь нужно соединить все элементы проводниками. Для этого нажимаем на пин отладочной платы и двигаем мышкой, после чего появится проводник.
Ведём его до места, где нужно будет повернуть проводник на 90 градусов и кликаем левой клавишей мыши. Проводник изогнётся, перемещаем мышь далее, при необходимости делаем нужное количество изгибов проводника и подсоединяем его к контакту servo. Для этого нужно довести проводник до нужного контакта и нажать левой клавишей мыши. По аналогии делаем подключение других контактов.
Как видим, проводники 5В автоматически создаются красного цвета, а проводники GND -чёрного. Все остальные зелёного.
Для того чтобы изменить цвет проводника или свойства элементов электрической схемы нужно перейти на вкладку «diagram.json». Для изменения цвета проводника меняем значение «green» на «blue».
Чтобы узнать дополнительные параметры элементов схемы, которые можно изменять, нажимаем на элемент. Над ним появится знак вопроса. Если нажать на него, откроется страница справки, где описаны свойства элемента и что можно изменить.
Для сервопривода можно изменить тип качалки и первоначальное положение.
У потенциометра в виде слайдера можно изменить его длину и начальное значение.
Затем пишем код для управления сервоприводом. Пример можно взять из моего урока, указав нужные pins подключения servo и потенциометра.
#include <Servo.h> Servo myservo; int potpin = 0; int val; void setup() { myservo.attach(9); } void loop() { val = analogRead(potpin); val = map(val, 0, 1023, 0, 180); myservo.write(val); delay(15); }
Для проверки проекта нажимаем на зелёную кнопку «Пуск».
После чего можно подвигать бегунок потенциометра. При изменении
положения потенциометра
изменяется положение качалки сервопривода.
Проект собран и проверен, сейчас им можно поделиться, нажав на кнопку «Share». Также можно сохранить проект на компьютер, нажав на кнопку «Download project ZIP».
Проект скачается на ваш ПК в архиве, который содержит скетч и файл настроек для симулятора «diagram.json».
В симуляторе wokwi много готовых примеров, которые рассмотрим далее.
Нашел я симулятор wokwi при разработке проекта светодиодной гирлянды на ESP32. При создании проекта с большим количеством световых эффектов достаточно сложно проверить каждый. В первую очередь это связано с тем, что компиляция и загрузка кода в плату ESP32 может занимать 5-7 мин.
Поэтому симулятор просто незаменим для написания световых эффектов с использованием библиотеки FastLED.
В симуляторе есть несколько примеров использования библиотеки FastLED для создания световых эффектов с использованием светодиодных лент. Вот один из примеров.
#include <FastLED.h> #define LED_PIN 5 #define NUM_LEDS 50 #define BRIGHTNESS 64 #define LED_TYPE WS2811 #define COLOR_ORDER GRB CRGB leds[NUM_LEDS]; #define UPDATES_PER_SECOND 100 CRGBPalette16 currentPalette; TBlendType currentBlending; extern CRGBPalette16 myRedWhiteBluePalette; extern const TProgmemPalette16 myRedWhiteBluePalette_p PROGMEM; void setup() { delay( 3000 ); // power-up safety delay FastLED.addLeds<LED_TYPE, LED_PIN, COLOR_ORDER>(leds, NUM_LEDS).setCorrection( TypicalLEDStrip ); FastLED.setBrightness( BRIGHTNESS ); currentPalette = RainbowColors_p; currentBlending = LINEARBLEND; } void loop() { ChangePalettePeriodically(); static uint8_t startIndex = 0; startIndex = startIndex + 1; /* motion speed */ FillLEDsFromPaletteColors( startIndex); FastLED.show(); FastLED.delay(1000 / UPDATES_PER_SECOND); } void FillLEDsFromPaletteColors( uint8_t colorIndex) { uint8_t brightness = 255; for( int i = 0; i < NUM_LEDS; i++) { leds[i] = ColorFromPalette( currentPalette, colorIndex, brightness, currentBlending); colorIndex += 3; } } void ChangePalettePeriodically() { uint8_t secondHand = (millis() / 1000) % 60; static uint8_t lastSecond = 99; if( lastSecond != secondHand) { lastSecond = secondHand; if( secondHand == 0) { currentPalette = RainbowColors_p; currentBlending = LINEARBLEND; } if( secondHand == 10) { currentPalette = RainbowStripeColors_p; currentBlending = NOBLEND; } if( secondHand == 15) { currentPalette = RainbowStripeColors_p; currentBlending = LINEARBLEND; } if( secondHand == 20) { SetupPurpleAndGreenPalette(); currentBlending = LINEARBLEND; } if( secondHand == 25) { SetupTotallyRandomPalette(); currentBlending = LINEARBLEND; } if( secondHand == 30) { SetupBlackAndWhiteStripedPalette(); currentBlending = NOBLEND; } if( secondHand == 35) { SetupBlackAndWhiteStripedPalette(); currentBlending = LINEARBLEND; } if( secondHand == 40) { currentPalette = CloudColors_p; currentBlending = LINEARBLEND; } if( secondHand == 45) { currentPalette = PartyColors_p; currentBlending = LINEARBLEND; } if( secondHand == 50) { currentPalette = myRedWhiteBluePalette_p; currentBlending = NOBLEND; } if( secondHand == 55) { currentPalette = myRedWhiteBluePalette_p; currentBlending = LINEARBLEND; } } } void SetupTotallyRandomPalette() { for( int i = 0; i < 16; i++) { currentPalette[i] = CHSV( random8(), 255, random8()); } } void SetupBlackAndWhiteStripedPalette() { // 'black out' all 16 palette entries... fill_solid( currentPalette, 16, CRGB::Black); // and set every fourth one to white. currentPalette[0] = CRGB::White; currentPalette[4] = CRGB::White; currentPalette[8] = CRGB::White; currentPalette[12] = CRGB::White; } void SetupPurpleAndGreenPalette() { CRGB purple = CHSV( HUE_PURPLE, 255, 255); CRGB green = CHSV( HUE_GREEN, 255, 255); CRGB black = CRGB::Black; currentPalette = CRGBPalette16( green, green, black, black, purple, purple, black, black, green, green, black, black, purple, purple, black, black ); } const TProgmemPalette16 myRedWhiteBluePalette_p PROGMEM = { CRGB::Red, CRGB::Gray, // 'white' is too bright compared to red and blue CRGB::Blue, CRGB::Black, CRGB::Red, CRGB::Gray, CRGB::Blue, CRGB::Black, CRGB::Red, CRGB::Red, CRGB::Gray, CRGB::Gray, CRGB::Blue, CRGB::Blue, CRGB::Black, CRGB::Black };
В данном примере поочерёдно выводятся несколько световых режимов:
В данном примере много разнообразных эффектов. Возможно, я добавлю некоторые в проект новогодней гирлянды.
Кроме программирования адресных светодиодных лент, можно запрограммировать светодиодные матрицы, создавая различные красивые эффекты, например, эффект матрицы.
#include "FastLED.h" // Matrix size #define NUM_ROWS 16 #define NUM_COLS 16 // LEDs pin #define DATA_PIN 3 // LED brightness #define BRIGHTNESS 255 #define NUM_LEDS NUM_ROWS * NUM_COLS // Define the array of leds CRGB leds[NUM_LEDS]; byte rain[NUM_LEDS]; byte counter = 1; int speed = 1; void setup() { FastLED.addLeds<NEOPIXEL, DATA_PIN>(leds, NUM_LEDS); FastLED.setBrightness(BRIGHTNESS); raininit(); } void loop() { EVERY_N_MILLISECONDS(100) { updaterain(); FastLED.show(); } EVERY_N_MILLISECONDS(30) { changepattern(); } } //loop void changepattern () { int rand1 = random16 (NUM_LEDS); int rand2 = random16 (NUM_LEDS); if ((rain[rand1] == 1) && (rain[rand2] == 0) ) //simple get two random dot 1 and 0 and swap it, { rain[rand1] = 0; //this will not change total number of dots rain[rand2] = 1; } } //changepattern void raininit() { //init array of dots. run once for (int i = 0; i < NUM_LEDS; i++) { if (random8(20) == 0) { rain[i] = 1; //random8(20) number of dots. decrease for more dots } else { rain[i] = 0; } } } //raininit void updaterain() { for (byte i = 0; i < NUM_COLS; i++) { for (byte j = 0; j < NUM_ROWS; j++) { byte layer = rain[XY(i, ((j + speed + random8(2) + NUM_ROWS) % NUM_ROWS))]; //fake scroll based on shift coordinate // random8(2) add glitchy look if (layer) { leds[XY((NUM_COLS - 1) - i, (NUM_ROWS - 1) - j)] = CHSV(110, 255, BRIGHTNESS); } } } speed ++; fadeToBlackBy(leds, NUM_LEDS, 40); blurRows(leds, NUM_COLS, NUM_ROWS, 16); //if you want } //updaterain uint16_t XY (uint8_t x, uint8_t y) { return (y * NUM_COLS + x); }
Данный пример в симуляторе выглядит вот так.
Но делать эффекты не очень интересно. Куда интереснее сделать анимацию на светодиодной матрице. Давайте рассмотрим готовые примеры анимации:
Кроме этого, можно собрать матрицу из отдельных адресных светодиодов или купить светодиодную гирлянду и сделать анимацию на окне. Предварительно проверив в симуляторе, как это будет выглядеть.
По работе с адресными светодиодами есть много примеров. Возможно, в дальнейшем сделаю подборку эффектов.
Симулятором Arduino UNO, Attiny85 никого не удивить. В симуляторе wokwi можно запрограммировать проект с использованием отладочной платы Arduino MEGA, NANO, Raspberry Pi Pico. А также приятная новость: можно сделать проект в среде Arduino IDE с использованием отладочной платы ESP32, которая последнее время набирает популярность благодаря высокой производительности и относительно небольшой стоимости.
Данный симулятор позволяет собрать и протестировать достаточно интересные проекты в среде Arduino IDE без использования железа.
Симулятор MicroPython по умолчанию рассчитан на работу с Raspberry Pi Pico. Об этом говорит следующий факт: при нажатии на кнопку создания проекта на MicroPython открывается поле разработки с платой Raspberry Pi Pico.
Для создания проектов MicroPython с использованием ESP32 предусмотрена отдельная кнопка.
При нажатии на неё открывается поле для создания проектов на ESP32. У меня есть серия уроков по программированию ESP32 на MicroPython. Надеюсь, что данный симулятор поможет вам в изучении данных уроков.
Как вы уже поняли, в симуляторе предустановлена библиотека для работы с адресными светодиодами FastLED. Кроме неё предустановлены следующие библиотеки: Adafruit_NeoPixel, Adafruit_SSD1306, DHT-sensor-library, LiquidCrystal_I2C, MD_Parola, RTClib, Servo, SevSeg, ssd1306, SSD1306Ascii и другие.
Полный список библиотек с примерами кода вы можете посмотреть вот на этой странице.
Подведём итоги.
Симулятор wokwi имеет большой набор отладочных плат и электроники, которые можно использовать при создании проектов. Но есть и минусы:
Понравилась статья Симулятор Arduino, Raspberry Pi Pico, ESP32, FastLED, MicroPython? Не забудь поделиться с друзьями в соц. сетях.
А также подписаться на наш канал на YouTube, вступить в группу Вконтакте, в группу на Facebook.
Спасибо за внимание!
Технологии начинаются с простого!
Фотографии к статье
Виджеты для Easy HMI
Читайте также
Мы в соц сетях
Комментарии