Wasmino = WASM + Arduino (Running Arduino code in browser) – Yifan Gu's Blog
source link: https://blog.yifangu.com/2020/12/30/wasmino-wasm-arduino-running-arduino-code-in-browser/
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
Wasmino = WASM + Arduino (Running Arduino code in browser)
Wasmino is an Arduino core fully compatible with the Arduino IDE. It allows you to compile your Arduino sketch to WebAssembly and run it in a browser, all using the Arduino IDE.
Showcase
This is the off-the-shelf “Fade” example in the Arduino IDE.
/*
Fade
This example shows how to fade an LED on pin 9 using the analogWrite()
function.
The analogWrite() function uses PWM, so if you want to change the pin you're
using, be sure to use another PWM capable pin. On most Arduino, the PWM pins
are identified with a "~" sign, like ~3, ~5, ~6, ~9, ~10 and ~11.
This example code is in the public domain.
*/
int
led = 9;
// the PWM pin the LED is attached to
int
brightness = 0;
// how bright the LED is
int
fadeAmount = 5;
// how many points to fade the LED by
// the setup routine runs once when you press reset:
void
setup() {
// declare pin 9 to be an output:
pinMode(led, OUTPUT);
}
// the loop routine runs over and over again forever:
void
loop() {
// set the brightness of pin 9:
analogWrite(led, brightness);
// change the brightness for next time through the loop:
brightness = brightness + fadeAmount;
// reverse the direction of the fading at the ends of the fade:
if
(brightness <= 0 || brightness >= 255) {
fadeAmount = -fadeAmount;
}
// wait for 30 milliseconds to see the dimming effect
delay(30);
}
You can see it compiled to WASM and running here:
(Click the “Run” button and the LED should start to animate)
Setting it up
Disclaimer: The toolchain is only tested on Windows (x86-64) and Linux (x86-64), and probably will work for MacOS. It 100% won’t work on 32bit systems since some dependencies (WASI and Binaryen) are 64bit only.
You’ll need your Arduino IDE installed first.
Go to File -> Preferences, and add https://github.com/wasmino/wasmino-core/releases/download/v0.0.1/package_wasmino_index.json to “Additional Boards Manager URLs”.
Install “Wasmino Virtual Boards” in Tools -> Board -> Board Manager. Select Wasmino as as target board.
Write some Arduino code, click upload, and an URL will be generated for you. (If you are uploading for the first time, it will ask you to login to your GitHub account. It uses GitHub Gist for saving the compiled WASM binary. The login times out in 60 seconds.)
Paste that URL into your browser and use the UI to add LEDs or toggle switches. The URL will automatically update as you make changes. You can then copy the resulting URL in the browser and share it with other people.
Caveats
The Wasmino should be viewed as having an infinitely fast CPU, and operations other than delay
and delayMicroseconds
do not take any CPU time. Calling time functions micros
and millis
should reflect this. IO can only happen during sleep, therefore you cannot do
while (!digitalRead(2)) {} // this will hang the browser tab
and should do this instead
while (!digitalRead(2)) {
delay(50);
}
Having a infinitely fast CPU also means that interrupts will only happen during delay
and delayMicroseconds
. It is still good practice to use noInterrupts
and interrupts
to protect critical sections if you plan to use your code on real hardware.
Other caveats exist such as the lack of BUILTIN_LED
macro since Wasmino, being virtual, doesn’t have a built-in LED.
What works and what doesn’t work
From: https://www.arduino.cc/reference/en/
y: working
n: not working
Digital I/O
y digitalRead()
y digitalWrite()
y pinMode()
Analog I/O
y* analogRead()
n analogReference()
y analogWrite()
Zero, Due & MKR Family
n analogReadResolution()
n analogWriteResolution()
Advanced I/O
n noTone()
n pulseIn()
n pulseInLong()
n shiftIn()
n shiftOut()
n tone()
Time
y delay()
y delayMicroseconds()
y micros()
y millis()
Math
y abs()
y constrain()
y map()
y max()
y min()
y pow()
y sq()
y sqrt()
Trigonometry
y cos()
y sin()
y tan()
Characters
n isAlpha()
n isAlphaNumeric()
n isAscii()
n isControl()
n isDigit()
n isGraph()
n isHexadecimalDigit()
n isLowerCase()
n isPrintable()
n isPunct()
n isSpace()
n isUpperCase()
n isWhitespace()
Random Numbers
n random()
n randomSeed()
Bits and Bytes
y bit()
y bitClear()
y bitRead()
y bitSet()
y bitWrite()
y highByte()
y lowByte()
External Interrupts
y attachInterrupt()
y detachInterrupt()
Interrupts
y interrupts()
y noInterrupts()
Communication
y* Serial
y Stream
USB
n Keyboard
n Mouse
* Not exposed in the demo web app.
* Not exposed in the demo web app.
The Wasmino Arduino core is available at https://github.com/wasmino/wasmino-core.
The runtime is also available at https://github.com/wasmino/wasmino-runtime.
Posted byYifan GuDecember 30, 2020December 31, 2020Posted inUncategorized
Recommend
About Joyk
Aggregate valuable and interesting links.
Joyk means Joy of geeK