Симулятор Arduino, Raspberry Pi Pico, ESP32, FastLED, MicroPython.

У меня на сайте и на канале есть блок уроков по программированию Arduino с использованием симулятора, который входит в состав TinkerCad: Circuits Arduino. В данном симуляторе небольшая элементная база, а из микроконтроллеров доступны Arduino UNO, Attiny85 и ещё несколько малоизвестных. А хочется создавать проекты на ESP32, без ожидания долгой компиляции. Также последнее время становится популярным программирование на MicroPython Raspberry Pi Pico и ESP32. Всё это и многое другое есть в онлайн симуляторе wokwi. Создавать и проверять проекты можно без регистрации и в последствии поделиться ссылкой на свой проект. Невероятно полезно, не правда ли!?


Как начать работать с онлайн симулятором Arduino, Raspberry Pi Pico, ESP32, FastLED, MicroPython?

Для того чтобы начать создавать свои проекты с использованием различных плат Arduino, Raspberry Pi Pico, ESP32, Attiny85 достаточно прейти на сайт wokwi.com и выбрать нужную плату для разработки.

Как начать работать с онлайн симулятором Arduino, Raspberry Pi Pico, ESP32, FastLED, MicroPython?

Также можно производить разработку проектов на MicroPython с использованием следующих отладочных плат: Raspberry Pi Pico и ESP32.

Создаём первый проект в симуляторе wokwi.

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

Создаём первый проект в симуляторе wokwi.

Откроется рабочая область. С левой стороны поля для написания кода и вкладка для редактирования внешнего вида проекта в формате json.

Откроется рабочая область. С левой стороны поля для написания кода и вкладка для редактирования внешнего вида

С левой стороны находится поле сборки электрической схемы, на которое размещена Arduino MEGA. Для того чтобы добавить нужные элементы, нажимаем на кнопку со знаком «Плюс». Откроется список с доступными элементами. Добавим на рабочее поле потенциометр и servo.

 Добавим на рабочее поле потенциометр и servo.

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

Теперь нужно соединить все элементы проводниками.

Ведём его до места, где нужно будет повернуть проводник на 90 градусов и кликаем левой клавишей мыши. Проводник изогнётся, перемещаем мышь далее, при необходимости делаем нужное количество изгибов проводника и подсоединяем его к контакту servo. Для этого нужно довести проводник до нужного контакта и нажать левой клавишей мыши. По аналогии делаем подключение других контактов.

Как видим, проводники 5В автоматически создаются красного цвета, а проводники GND -чёрного. Все остальные зелёного.

Как видим, проводникиавтоматически создаются красного цвета, а проводники GND -чёрного. Все остальные зелёного.

Для того чтобы изменить цвет проводника или свойства элементов электрической схемы нужно перейти на вкладку «diagram.json».

Для того чтобы изменить цвет проводника или свойства элементов электрической схемы нужно перейти на вкладку «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».

роект собран и проверен, сейчас им можно поделиться, нажав на кнопку «Share».

Проект скачается на ваш ПК в архиве, который содержит скетч и файл настроек для симулятора «diagram.json».

Проект скачается на ваш ПК в архиве, который содержит скетч и файл настроек для симулятора «diagram.json».

В симуляторе wokwi много готовых примеров, которые рассмотрим далее.

Создание светодиодных эффектов с использованием библиотеки FastLED в симуляторе.

Нашел я симулятор wokwi при разработке проекта светодиодной гирлянды на ESP32. При создании проекта с большим количеством световых эффектов достаточно сложно проверить каждый. В первую очередь это связано с тем, что компиляция и загрузка кода в плату ESP32 может занимать 5-7 мин.

Создание светодиодных эффектов с использованием библиотеки FastLED в симуляторе.

Поэтому симулятор просто незаменим для написания световых эффектов с использованием библиотеки 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 в симуляторе wokwi.

Симулятором Arduino UNO, Attiny85 никого не удивить. В симуляторе wokwi можно запрограммировать проект с использованием отладочной платы Arduino MEGA, NANO, Raspberry Pi Pico. А также приятная новость: можно сделать проект в среде Arduino IDE с использованием отладочной платы ESP32, которая последнее время набирает популярность благодаря высокой производительности и относительно небольшой стоимости.

Arduino IDE с использованием отладочной платы ESP32

Данный симулятор позволяет собрать и протестировать достаточно интересные проекты в среде Arduino IDE без использования железа.

Симулятор проектов на MicroPython.

Симулятор MicroPython по умолчанию рассчитан на работу с Raspberry Pi Pico. Об этом говорит следующий факт: при нажатии на кнопку создания проекта на MicroPython открывается поле разработки с платой Raspberry Pi Pico.

Симулятор MicroPython по умолчанию рассчитан на работу с Raspberry Pi Pico

Для создания проектов MicroPython с использованием ESP32 предусмотрена отдельная кнопка.

Для создания проектов MicroPython с использованием ESP32 предусмотрена отдельная кнопка.

При нажатии на неё открывается поле для создания проектов на ESP32. У меня есть серия уроков по программированию ESP32 на MicroPython. Надеюсь, что данный симулятор поможет вам в изучении данных уроков.

Какие библиотеки присутствуют в симуляторе wokwi?

Как вы уже поняли, в симуляторе предустановлена библиотека для работы с адресными светодиодами FastLED. Кроме неё предустановлены следующие библиотеки: Adafruit_NeoPixel, Adafruit_SSD1306, DHT-sensor-library, LiquidCrystal_I2C, MD_Parola, RTClib, Servo, SevSeg, ssd1306, SSD1306Ascii и другие.

библиотеки: Adafruit_NeoPixel, Adafruit_SSD1306, DHT-sensor-library, LiquidCrystal_I2C, MD_Parola, RTClib, Servo, SevSeg, ssd1306, SSD1306Ascii

Полный список библиотек с примерами кода вы можете посмотреть вот на этой странице.

Подведём итоги.

Симулятор wokwi имеет большой набор отладочных плат и электроники, которые можно использовать при создании проектов. Но есть и минусы:

  • отсутствие русского языка интерфейса;
  • для изменения параметров элементов необходимо редактирование файла «diagram.json». Это не очень удобно.

Понравилась статья Симулятор Arduino, Raspberry Pi Pico, ESP32, FastLED, MicroPython? Не забудь поделиться с друзьями в соц. сетях.

А также подписаться на наш канал на YouTube, вступить в группу Вконтакте, в группу на Facebook.

Спасибо за внимание!

Технологии начинаются с простого!

Фотографии к статье

Комментарии

Ваше Имя*


Разработка проектов