《WOKWI》オンライン シミュレータ のすすめ

# 0. はじめに

無料で、オンラインで使える、ハードウェア シミュレータを紹介します。

シミュレーションできるマイコンボードは、以下のラインナップ。

- Arduino Uno / Mega / Nano
- ESP32 / ESP32-Sx / ESP32-Cx
- STM32
- Raspberry Pi Pico
- ATtiny85

ただ単にSoC(MCU)をシミュレーションするだけではなく、周辺デバイスや開発環境を含めてシミュレーションできます。

使える開発環境は、Arduino環境、Micropython環境 と Rust環境。Raspberry Pi Pico のみ CircuitPthon環境も。

つまり、オンラインで、マイコンとセンサーやデバイスを組み合わせて配線して、C/C++やPythonでコードを書いて、そのコードをオンラインで、すぐに実行できるのです。便利だ。


以下の動画は、ATTiny85とLEDを6本使って、下記のスケッチ（プログラム）で動作させた結果です。

[<img width="160" alt="attiny85_led.gif" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/283293/2ccbbcc5-1713-4c4a-de90-8f7a075e3cc8.gif" />](https://wokwi.com/projects/383058344541028353)

```c:sketch.ino
int pins[] = {PB2, PB1, PB0, PB4, PB3, PB5};

void setup() {
  // put your setup code here, to run once:
  for (int n=0; n<6; n++) {
    pinMode(pins[n], OUTPUT);
  }
}

void loop() {
  // put your main code here, to run repeatedly:
  static int currect_pin = 0;
  static int previous_pin = 0;
  digitalWrite(pins[previous_pin], LOW);
  digitalWrite(pins[currect_pin], HIGH);
  previous_pin = currect_pin;
  currect_pin = (++currect_pin) % 6;
  delay(100);
}
```

# 1. WOKWI

 そのオンライン シミュレータは、[**WOKWI**](https://wokwi.com/) です。

[<img width="400" alt="wokwi.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/283293/c88f60de-9dd8-df62-0a98-f572bd2c0ca5.png" />](https://wokwi.com/)

ボードを選んで、すでに公開されているプロジェクトを流用するも良し、新規で作るも良し。

# 2. 配線図を書く

まずは、WOKWIでサポートしているパーツ（センサーやデバイス）を使用して、配線図を書きます。

↓赤丸した**＋**アイコンをクリックすると、使用できるパーツのリストが表示されます。
<img width="400" alt="wokwi1.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/283293/5bcf69fd-e9d0-b64e-e0b2-7f49dda6a38e.png" /><br><img width="400" alt="wokwi2.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/283293/5ebd6b0b-1737-b476-c0bd-c1ba0bfa4759.png" />

パーツ類は、以下のラインナップ。 

|Categoly|Parts|
|-|-|
|Basic|<img width="30" alt="led.png" src="https://wokwi.com/images/parts-photos/wokwi-led.png" /> LED<br><img width="30" alt="pushbutton.png" src="https://wokwi.com/images/parts-photos/wokwi-pushbutton.png" /> Pushbutton<br><img width="30" alt="resistor.png" src="https://wokwi.com/images/parts-photos/wokwi-resistor.png" /> Resistor<br> |
|Display|<img width="30" alt="rgb-led.png" src="https://wokwi.com/images/parts-photos/wokwi-rgb-led.png" /> RGB LED<br><img width="30" alt="board-ssd1306.png" src="https://wokwi.com/images/parts-photos/board-ssd1306.png" /> SSD1306 OLED display<br><img width="30" alt="lcd1602.png" src="https://wokwi.com/images/parts-photos/wokwi-lcd1602.png" /> LCD 16x2<br><img width="30" alt="lcd1602-i2c.png" src="https://wokwi.com/images/parts-photos/wokwi-lcd1602-i2c.png" /> LCD 16x2 (I2C)<br><img width="30" alt="lcd2004.png" src="https://wokwi.com/images/parts-photos/wokwi-lcd2004.png" /> LCD 20x4<br><img width="30" alt="lcd2004-i2c.png" src="https://wokwi.com/images/parts-photos/wokwi-lcd2004-i2c.png" /> LCD 20x4 (I2C)<br><img width="30" alt="ili9341.png" src="https://wokwi.com/images/parts-photos/wokwi-ili9341.png" /> ILI9341 2.8" TFT-LCD display<br><img width="30" alt="board-ili9341-cap-touch.png" src="https://wokwi.com/images/parts-photos/board-ili9341-cap-touch.png" /> ILI9341 2.8" Touch Screen LCD<br><img width="30" alt="max7219-matrix.png" src="https://wokwi.com/images/parts-photos/wokwi-max7219-matrix.png" /> LED Dot Matrix (MAX7219)<br><img width="30" alt="neopixel.png" src="https://wokwi.com/images/parts-photos/wokwi-neopixel.png" /> NeoPixel Compatible LED (WS2812)<br><img width="30" alt="led-ring.png" src="https://wokwi.com/images/parts-photos/wokwi-led-ring.png" /> NeoPixel Compatible LED Ring (WS2812)<br><img width="30" alt="neopixel-meter.png" src="https://wokwi.com/images/parts-photos/wokwi-neopixel-meter.png" /> NeoPixel Meter<br><img width="30" alt="7segment.png" src="https://wokwi.com/images/parts-photos/wokwi-7segment.png" /> Seven Segment Display<br><img width="30" alt="7segment-4digit.png" src="https://wokwi.com/images/parts-photos/wokwi-7segment-4digit.png" /> Seven Segment Display (4 digits)<br><img width="30" alt="tm1637-7segment.png" src="https://wokwi.com/images/parts-photos/wokwi-tm1637-7segment.png" /> Seven Segment Display (TM1637)<br><img width="30" alt="led-bar-graph.png" src="https://wokwi.com/images/parts-photos/wokwi-led-bar-graph.png" /> LED Bar Graph<br><img width="30" alt="board-epaper-2in9.png" src="https://wokwi.com/images/parts-photos/board-epaper-2in9.png" /> 2.9" e-Paper Display (beta) |
|Input|<img width="30" alt="slide-switch.png" src="https://wokwi.com/images/parts-photos/wokwi-slide-switch.png" /> Slide switch<br><img width="30" alt="analog-joystick.png" src="https://wokwi.com/images/parts-photos/wokwi-analog-joystick.png" /> Analog Joystick<br><img width="30" alt="74hc595.png" src="https://wokwi.com/images/parts-photos/wokwi-74hc595.png" /> 74HC595 Shift Register<br><img width="30" alt="74hc165.png" src="https://wokwi.com/images/parts-photos/wokwi-74hc165.png" /> 74HC165 Input Shift Register (PISO)<br><img width="30" alt="dip-switch-8.png" src="https://wokwi.com/images/parts-photos/wokwi-dip-switch-8.png" /> DIP Switch 8<br><img width="30" alt="hx711-5kg.png" src="https://wokwi.com/images/parts-photos/wokwi-hx711-5kg.png" /> HX711 Load Cell (5kg)<br><img width="30" alt="hx711.png" src="https://wokwi.com/images/parts-photos/wokwi-hx711.png" /> HX711 Load Cell (50kg)<br><img width="30" alt="ir-receiver.png" src="https://wokwi.com/images/parts-photos/wokwi-ir-receiver.png" /> IR Receiver<br><img width="30" alt="ir-remote.png" src="https://wokwi.com/images/parts-photos/wokwi-ir-remote.png" /> IR Remote<br><img width="30" alt="ky-040.png" src="https://wokwi.com/images/parts-photos/wokwi-ky-040.png" /> Rotary Encoder (KY-040)<br><img width="30" alt="membrane-keypad.png" src="https://wokwi.com/images/parts-photos/wokwi-membrane-keypad.png" /> Keypad<br><img width="30" alt="potentiometer.png" src="https://wokwi.com/images/parts-photos/wokwi-potentiometer.png" /> Potentiometer<br><img width="30" alt="slide-potentiometer.png" src="https://wokwi.com/images/parts-photos/wokwi-slide-potentiometer.png" /> Slide Potentiometer<br><img width="30" alt="board-cd74hc4067.png" src="https://wokwi.com/images/parts-photos/board-cd74hc4067.png" /> 16 Channel Analog Multiplexer (CD74HC4067) |
|Sensor|<img width="30" alt="hc-sr04.png" src="https://wokwi.com/images/parts-photos/wokwi-hc-sr04.png" /> HC-SR04 Ultrasonic Distance Sensor<br><img width="30" alt="dht22.png" src="https://wokwi.com/images/parts-photos/wokwi-dht22.png" /> DHT22<br><img width="30" alt="ds18b20.png" src="https://wokwi.com/images/parts-photos/wokwi-ds18b20.png" /> DS18B20 Temperature Sensor (beta)<br><img width="30" alt="pir-motion-sensor" src="https://wokwi.com/images/parts-photos/wokwi-pir-motion-sensor.png" /> PIR Motion Sensor<br><img width="30" alt="ntc-temperature-sensor.png" src="https://wokwi.com/images/parts-photos/wokwi-ntc-temperature-sensor.png" /> Analog Temperature Sensor (NTC)<br><img width="30" alt="photoresistor-sensor.png" src="https://wokwi.com/images/parts-photos/wokwi-photoresistor-sensor.png" /> Photoresistor (LDR) Sensor<br><img width="30" alt="mpu6050.png" src="https://wokwi.com/images/parts-photos/wokwi-mpu6050.png" /> MPU6050 Accelerometer + Gyroscope<br><img width="30" alt="ds1307.png" src="https://wokwi.com/images/parts-photos/wokwi-ds1307.png" /> DS1307 RTC |
|Output|<img width="30" alt="buzzer.png" src="https://wokwi.com/images/parts-photos/wokwi-buzzer.png" /> Buzzer<br><img width="30" alt="servo.png" src="https://wokwi.com/images/parts-photos/wokwi-servo.png" /> Servo<br><img width="30" alt="stepper-motor.png" src="https://wokwi.com/images/parts-photos/wokwi-stepper-motor.png" /> Bipolar Stepper Motor<br><img width="30" alt="a4988.png" src="https://wokwi.com/images/parts-photos/wokwi-a4988.png" /> A4988 Stepper Motor Driver<br><img width="30" alt="biaxial-stepper.png" src="https://wokwi.com/images/parts-photos/wokwi-biaxial-stepper.png" /> Biaxial Stepper Motor<br><img width="30" alt="nlsf595.png" src="https://wokwi.com/images/parts-photos/wokwi-nlsf595.png" /> NLSF595 SPI Tri-Color LED Driver<br><img width="30" alt="relay-module.png" src="https://wokwi.com/images/parts-photos/wokwi-relay-module.png" /> Relay Module<br><img width="30" alt="ks2e-m-dc5.png" src="https://wokwi.com/images/parts-photos/wokwi-ks2e-m-dc5.png" /> DPDT Relay |
|Breadboard|<img width="30" alt="breadboard.png" src="https://wokwi.com/images/parts-photos/wokwi-breadboard.png" /> Breadboard<br><img width="30" alt="breadboard-half.png" src="https://wokwi.com/images/parts-photos/wokwi-breadboard-half.png" /> Half Breadboard<br><img width="30" alt="breadboard-mini.png" src="https://wokwi.com/images/parts-photos/wokwi-breadboard-mini.png" /> Mini Breadboard |
|Misc|<img width="30" alt="logic-analyzer.png" src="https://wokwi.com/images/parts-photos/wokwi-logic-analyzer.png" /> Logic Analyzer (8 channels)<br><img width="30" alt="microsd-card.png" src="https://wokwi.com/images/parts-photos/wokwi-microsd-card.png" /> microSD card<br><img width="30" alt="logo.png" src="https://wokwi.com/images/parts-photos/wokwi-logo.png" /> Wokwi Logo<br><img width="30" alt="custom-chip.png" src="https://wokwi.com/images/parts-photos/custom-chip.png" /> Custom Chip|
|Power|<img width="30" alt="vcc.png" src="https://wokwi.com/images/parts-photos/wokwi-vcc.png" /> VCC Symbol<br><img width="30" alt="gnd.png" src="https://wokwi.com/images/parts-photos/wokwi-gnd.png" /> GND Symbol |
|Logic|<img width="30" alt="gate-not.png" src="https://wokwi.com/images/parts-photos/wokwi-gate-not.png" /> NOT gate<br><img width="30" alt="gate-and-2.png" src="https://wokwi.com/images/parts-photos/wokwi-gate-and-2.png" /> AND gate<br><img width="30" alt="gate-or-2.png" src="https://wokwi.com/images/parts-photos/wokwi-gate-or-2.png" /> OR gate<br><img width="30" alt="gate-xor-2.png" src="https://wokwi.com/images/parts-photos/wokwi-gate-xor-2.png" /> XOR gate<br><img width="30" alt="gate-nand-2.png" src="https://wokwi.com/images/parts-photos/wokwi-gate-nand-2.png" /> NAND gate<br><img width="30" alt="mux-2.png" src="https://wokwi.com/images/parts-photos/wokwi-mux-2.png" /> MUX<br><img width="30" alt="flip-flop-d.png" src="https://wokwi.com/images/parts-photos/wokwi-flip-flop-d.png" /> Flip-Flop D<br><img width="30" alt="flip-flop-dsr.png" src="https://wokwi.com/images/parts-photos/wokwi-flip-flop-dsr.png" /> Flip-Flop DSR |

普通の電子工作なら、十分なライナップだと思います。

配置したセンサーやデバイスのピンにマウスを当てると、簡単に配線できます。
SPIやI2Cデバイスなど、信号線が決まっているピンで、マイコン側で使えるピンが制限される場合は、使えるピンが目立つように工夫されているので、リアルな配線より、配線間違いは起こし難いように思います。

配線中はマウスクリックすると、そこまでの配線を確定することができます。使ってみればすぐに要領がつかめると思います。

なお、すべてのパーツ類はVCCとGNDの配線は省略できます（ブレッドボードでは、そうは行かないので、地味にありがたい）。

# 3. コードを書く

配線が終わったら、コードを書きます。ほとんど、Arduino IDEでコードを書いているのと変わらない感覚です。サジェストも出ます。


![wokwi3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/283293/58f9f7e3-ef52-2830-5d4c-072d9d57dd67.png)


# 4. 実行

回路図側の ▶︎アイコンをクリックすると、ビルドされて実際にシミュレーションが開始されます。

コンパイルエラーがある場合は、エラーメッセージがポップ表示されます。

<img width="200" alt="attiny85_led.gif" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/283293/2ccbbcc5-1713-4c4a-de90-8f7a075e3cc8.gif" />

■アイコンクリックで終了、
Pause(‖)アイコンをクリックすると、一時停止するのですが、その時は、各ピンの現在の情報が表示されます。

![wokwi4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/283293/1f440c5a-dbe3-1985-973a-7ee6ea6d4333.png)


# 5. Micropython環境 を試してみる

パーツ一覧にある SD-CardスロットをESP32に接続して、自分が以前投稿した記事のコードを試してみる。

https://qiita.com/nak435/items/f8cbba8da7596156db30

起動すると、画面右下に**REPL**の領域がちゃんと出てくる。ESP32を起動した時のログまで表示され本格的だ。
REPLにPythonコードを打ち込んでもよいが、左側のペインに`main.py`が表示されていたので、ここに以前書いたSDカードをアクセスするコードをコピペして実行させた。

黄色線で囲った出力が、このコードの出力結果だ。実機と全く同じでSDカードに読み書きできています。

[<img width="500" alt="wokwi5.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/283293/207dd793-79fd-294e-b8dc-f68b83f65323.png" />](https://wokwi.com/projects/383017599673667585)


# 6. おわりに

つい先日、こんなすごいオンライン シミュレータが無料で利用できることに驚いて、急いでこの記事を書きました。

[【WOKWI CLUB】課金すると](https://wokwi.com/club)、ローカルに環境を作れて、VSCode上でシミュレーションが行えたり、パーツや使用するライブラリが自由に追加できるようです。
また、本格的なロジックアナライザでプロトコル解析も行えるようです。

無料枠でも十分使えるので、ブレッドボードで回路を組むよりも手軽だし、コードの検証もできるので、今後、どんどん利用したいと思います。

マウス操作でスイッチ類のオン/オフは操作できますが、マウス操作できないInput系のセンサーやデバイスを使う場合は、コード上で工夫が必要みたいです。例えば、温度センサーをつないでも、実際の室温を測ってくれませんから。

使ってみればすぐに慣れると考え、今回は詳しい使い方の説明は省きました。
もう少し網羅的に知りたい方は、（英語ですが）以下の動画が参考になると思います。

https://youtu.be/6l9DWqb77KI?si=qsjvnGbByDwbKbM8

自分が持っていないセンサーやデバイスを使ってみるのも面白そうです。


以上

<br><br>

<hr>


WOKWI

https://wokwi.com/


<br>
ドキュメント（英語、ドイツ語、ブラジル語、中国語）

https://docs.wokwi.com


<br>
Micropython環境 直リンク

https://wokwi.com/micropython

<br>
Rust環境 直リンク

https://wokwi.com/rust


<br>
CircuitPython環境 直リンク（Raspberry Pi Picoのみ）

https://wokwi.com/projects/new/circuitpython-pi-pico