From be932c5198506aa9dc1f129e5d2541bd20ff28ee Mon Sep 17 00:00:00 2001 From: TaddyHC Date: Wed, 8 Mar 2023 17:30:35 -0600 Subject: [PATCH 1/8] Initial commit - First minor batch fix --- .../Genuino101CurieBLEHeartRateMonitor.md | 2 +- .../01.basics/05.digital-analog-pins/digital-analog-pins.md | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/content/library-examples/curie-ble/Genuino101CurieBLEHeartRateMonitor/Genuino101CurieBLEHeartRateMonitor.md b/content/library-examples/curie-ble/Genuino101CurieBLEHeartRateMonitor/Genuino101CurieBLEHeartRateMonitor.md index a73dc9e1ec..fd31a2702a 100644 --- a/content/library-examples/curie-ble/Genuino101CurieBLEHeartRateMonitor/Genuino101CurieBLEHeartRateMonitor.md +++ b/content/library-examples/curie-ble/Genuino101CurieBLEHeartRateMonitor/Genuino101CurieBLEHeartRateMonitor.md @@ -48,7 +48,7 @@ Set up the Arduino software as described in [Getting Started with Arduino 101](h ## Where to Go from Here -The Bluetooth® Low Energy includes [many other services](https://developer.bluetooth.org/gatt/services/Pages/ServicesHome.aspx) with which you can experiment, such as [Alert Notificaion Service](https://developer.bluetooth.org/gatt/services/Pages/ServiceViewer.aspx?u=org.bluetooth.service.alert_notification.xml), [Environmental Sensing](https://developer.bluetooth.org/gatt/services/Pages/ServiceViewer.aspx?u=org.bluetooth.service.environmental_sensing.xml), and [AutomationIO](https://developer.bluetooth.org/gatt/services/Pages/ServiceViewer.aspx?u=org.bluetooth.service.automation_io.xml), in which you can expose all of your Arduino's inputs and control its outputs. +The Bluetooth® Low Energy includes [many other services](https://developer.bluetooth.org/gatt/services/Pages/ServicesHome.aspx) with which you can experiment, such as [Alert Notification Service](https://developer.bluetooth.org/gatt/services/Pages/ServiceViewer.aspx?u=org.bluetooth.service.alert_notification.xml), [Environmental Sensing](https://developer.bluetooth.org/gatt/services/Pages/ServiceViewer.aspx?u=org.bluetooth.service.environmental_sensing.xml), and [AutomationIO](https://developer.bluetooth.org/gatt/services/Pages/ServiceViewer.aspx?u=org.bluetooth.service.automation_io.xml), in which you can expose all of your Arduino's inputs and control its outputs. This tutorial uses nRF Toolbox, which allows the use of 9 services. For more advanced capabilities, other discluded services, as well the CurieImu library's LED examples, we recommend using [LightBlue for iOS](https://itunes.apple.com/it/app/lightblue-explorer-bluetooth/id557428110?mt=8) or [nRF Control Panel for Android](https://play.google.com/store/apps/details?id=no.nordicsemi.android.mcp&hl=it). ## Code diff --git a/content/micropython/01.basics/05.digital-analog-pins/digital-analog-pins.md b/content/micropython/01.basics/05.digital-analog-pins/digital-analog-pins.md index 28a3af518a..5b66e6d653 100644 --- a/content/micropython/01.basics/05.digital-analog-pins/digital-analog-pins.md +++ b/content/micropython/01.basics/05.digital-analog-pins/digital-analog-pins.md @@ -90,7 +90,7 @@ while True: ## Analog Pins -An example of analog pin is the ADC class, that supplies an interface to analog-to-digital convertors, and figures a single endpoint that can sample a continuous voltage and convert it to a discretised value. +An example of analog pin is the ADC class, that supplies an interface to analog-to-digital converters, and figures a single endpoint that can sample a continuous voltage and convert it to a discretised value. There are four methods to use inside the ADC class: `ADC.init`, `ADC.block()`, `ADC.read_16()` and `ADC.read_uv()`. From 6c6d1aab7978e00cf2741f0a1d48cfa5ed8638c6 Mon Sep 17 00:00:00 2001 From: TaddyHC Date: Wed, 8 Mar 2023 17:37:08 -0600 Subject: [PATCH 2/8] Second batch fix --- .../control-two-relays-over-the-internet.md | 2 +- .../localize-your-board-with-an-sms.md | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/content/tutorials/projects/control-two-relays-over-the-internet/control-two-relays-over-the-internet.md b/content/tutorials/projects/control-two-relays-over-the-internet/control-two-relays-over-the-internet.md index 3db0a0a58d..d47c3bcc6a 100644 --- a/content/tutorials/projects/control-two-relays-over-the-internet/control-two-relays-over-the-internet.md +++ b/content/tutorials/projects/control-two-relays-over-the-internet/control-two-relays-over-the-internet.md @@ -157,7 +157,7 @@ Serial.println("LED on V1: on"); Before you can get everything up and running you should have filled the **arduino_secrets.h** piece of code with the auth token got by email and the credentials to access the internet over GPRS. With this data, the sketch can be uploaded to the MKR GSM 1400. -Launch the Blynk application on your smartphone, then select the project created with the QR code and tap on the "play" icon on the right of the top bar. You should see the icon of a small board with a red blob on it: it is the status of the connection with your board. Load the sketch and wait for the connection process to happen. You may want to monitor it trhough the Serial Monitor. +Launch the Blynk application on your smartphone, then select the project created with the QR code and tap on the "play" icon on the right of the top bar. You should see the icon of a small board with a red blob on it: it is the status of the connection with your board. Load the sketch and wait for the connection process to happen. You may want to monitor it through the Serial Monitor. Anyway, when the board connects to the Blynk server, the red blob should disappear and on the interface you should start to see the virtual LED blinking with a slow pace. You are connected! diff --git a/content/tutorials/projects/localize-your-board-with-an-sms/localize-your-board-with-an-sms.md b/content/tutorials/projects/localize-your-board-with-an-sms/localize-your-board-with-an-sms.md index 863732bde1..0e9123d822 100644 --- a/content/tutorials/projects/localize-your-board-with-an-sms/localize-your-board-with-an-sms.md +++ b/content/tutorials/projects/localize-your-board-with-an-sms/localize-your-board-with-an-sms.md @@ -73,7 +73,7 @@ The `measureLocation()` queries the module to retry the coordinates by cellular //global variable used for location management String GSMlatitude = "0.000000"; String GSMlongitude = "0.000000"; -// This function use the location's APIs to get the device coordinates and update the globa variable if all the requirement are satisfied +// This function use the location's APIs to get the device coordinates and update the global variable if all the requirement are satisfied void measureLocation() { unsigned long timeout = millis(); while (millis() - timeout < 45000) { From ece72a5d53d0c6831d482f2833275b07918d245e Mon Sep 17 00:00:00 2001 From: TaddyHC Date: Wed, 8 Mar 2023 17:42:14 -0600 Subject: [PATCH 3/8] Third batch fix --- .../lorawan-farming-with-mkr-wan-1310.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/content/tutorials/projects/lorawan-farming-with-mkr-wan-1310/lorawan-farming-with-mkr-wan-1310.md b/content/tutorials/projects/lorawan-farming-with-mkr-wan-1310/lorawan-farming-with-mkr-wan-1310.md index 1c574082ef..c0ce9cb874 100644 --- a/content/tutorials/projects/lorawan-farming-with-mkr-wan-1310/lorawan-farming-with-mkr-wan-1310.md +++ b/content/tutorials/projects/lorawan-farming-with-mkr-wan-1310/lorawan-farming-with-mkr-wan-1310.md @@ -195,7 +195,7 @@ Connect then in the right order the nodes: you should have now something like th Here you can find this flow ready to be imported in your Node-RED! ```arduino -[{"id":"8ad521ed.ea0c4","type":"ttn uplink","z":"c9ea9bc1.58fd68","name":"Farm Sensor Network","app":"2860f894.1fd7e8","dev_id":"","field":"","x":220,"y":580,"wires":[["36b90326.4d9e8c"]]},{"id":"1ad0e4c9.9f91ab","type":"function","z":"c9ea9bc1.58fd68","name":"Extract LIGHT value","func":"var light = msg.payload.light;\nmsg.payload = light;\nreturn msg;","outputs":1,"noerr":0,"x":880,"y":560,"wires":[["6d2d3359.bd0eec","a6c068f5.820c68"]]},{"id":"6d2d3359.bd0eec","type":"ui_chart","z":"c9ea9bc1.58fd68","name":"Light Chart","group":"a3e71755.838d88","order":14,"width":0,"height":0,"label":"Light","chartType":"line","legend":"false","xformat":"HH:mm:ss","interpolate":"linear","nodata":"","dot":true,"ymin":"0","ymax":"1024","removeOlder":1,"removeOlderPoints":"","removeOlderUnit":"86400","cutout":0,"useOneColor":false,"colors":["#1f77b4","#aec7e8","#ff7f0e","#2ca02c","#98df8a","#d62728","#ff9896","#9467bd","#c5b0d5"],"useOldStyle":false,"x":1200,"y":520,"wires":[[],[]]},{"id":"36b90326.4d9e8c","type":"function","z":"c9ea9bc1.58fd68","name":"Extract Decoded Payload","func":"var value = msg.payload.payload;\nmsg.payload = value;\nmsg.topic = msg.dev_id;\nreturn msg;","outputs":1,"noerr":0,"x":460,"y":620,"wires":[["396b66c6.c58b8a"]]},{"id":"396b66c6.c58b8a","type":"json","z":"c9ea9bc1.58fd68","name":"JSON Parse","property":"payload","action":"","pretty":true,"x":650,"y":560,"wires":[["1ad0e4c9.9f91ab","db3bdfa9.f83f7","c46d41ac.9433","823b2cb9.0a4d8","2d5d8598.029f6a"]]},{"id":"db3bdfa9.f83f7","type":"debug","z":"c9ea9bc1.58fd68","name":"","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"false","x":830,"y":520,"wires":[]},{"id":"c46d41ac.9433","type":"function","z":"c9ea9bc1.58fd68","name":"Extract TEMPERATURE value","func":"var temp = msg.payload.temp;\nmsg.payload = temp;\nreturn msg;","outputs":1,"noerr":0,"x":910,"y":600,"wires":[["5378f82b.09f368","538a8ef5.794a3"]]},{"id":"823b2cb9.0a4d8","type":"function","z":"c9ea9bc1.58fd68","name":"Extract HUMIDITY value","func":"var hum = msg.payload.hum;\nmsg.payload = hum;\nreturn msg;","outputs":1,"noerr":0,"x":890,"y":640,"wires":[["8f2c98bd.4f1c98","4f71ad75.26f1d4"]]},{"id":"5378f82b.09f368","type":"ui_chart","z":"c9ea9bc1.58fd68","name":"Temp Chart","group":"a3e71755.838d88","order":14,"width":0,"height":0,"label":"Temperature","chartType":"line","legend":"false","xformat":"HH:mm:ss","interpolate":"linear","nodata":"","dot":true,"ymin":"-5","ymax":"45","removeOlder":1,"removeOlderPoints":"","removeOlderUnit":"86400","cutout":0,"useOneColor":false,"colors":["#1f77b4","#aec7e8","#ff7f0e","#2ca02c","#98df8a","#d62728","#ff9896","#9467bd","#c5b0d5"],"useOldStyle":false,"x":1200,"y":620,"wires":[[],[]]},{"id":"8f2c98bd.4f1c98","type":"ui_chart","z":"c9ea9bc1.58fd68","name":"Humidity Chart","group":"a3e71755.838d88","order":14,"width":0,"height":0,"label":"Humidity","chartType":"line","legend":"false","xformat":"HH:mm:ss","interpolate":"linear","nodata":"","dot":true,"ymin":"0","ymax":"100","removeOlder":1,"removeOlderPoints":"","removeOlderUnit":"86400","cutout":0,"useOneColor":false,"colors":["#1f77b4","#aec7e8","#ff7f0e","#2ca02c","#98df8a","#d62728","#ff9896","#9467bd","#c5b0d5"],"useOldStyle":false,"x":1210,"y":720,"wires":[[],[]]},{"id":"a6c068f5.820c68","type":"ui_gauge","z":"c9ea9bc1.58fd68","name":"","group":"8389b2aa.13894","order":14,"width":"0","height":"0","gtype":"gage","title":"","label":"","format":"{{value}}","min":0,"max":"1024","colors":["#000000","#757572","#ffffff"],"seg1":"","seg2":"","x":1180,"y":480,"wires":[]},{"id":"538a8ef5.794a3","type":"ui_gauge","z":"c9ea9bc1.58fd68","name":"","group":"8389b2aa.13894","order":15,"width":0,"height":0,"gtype":"gage","title":"","label":"°C","format":"{{value}}","min":"-5","max":"45","colors":["#34a5f2","#09e600","#ca3838"],"seg1":"10","seg2":"28","x":1180,"y":580,"wires":[]},{"id":"4f71ad75.26f1d4","type":"ui_gauge","z":"c9ea9bc1.58fd68","name":"","group":"8389b2aa.13894","order":16,"width":0,"height":0,"gtype":"gage","title":"","label":"%","format":"{{value}}","min":0,"max":"100","colors":["#91edf5","#008fe6","#0005f0"],"seg1":"","seg2":"","x":1180,"y":680,"wires":[]},{"id":"2d5d8598.029f6a","type":"function","z":"c9ea9bc1.58fd68","name":"Extract MOISTURE value","func":"var mois = msg.payload.mois;\nmsg.payload = mois;\nreturn msg;","outputs":1,"noerr":0,"x":900,"y":680,"wires":[["ad89379.1f100c8","307e3855.af1028","4829b01b.8e85e"]]},{"id":"ad89379.1f100c8","type":"ui_gauge","z":"c9ea9bc1.58fd68","name":"","group":"8389b2aa.13894","order":16,"width":0,"height":0,"gtype":"gage","title":"","label":"%","format":"{{value}}","min":0,"max":"1024","colors":["#91edf5","#008fe6","#0005f0"],"seg1":"","seg2":"","x":1190,"y":780,"wires":[]},{"id":"307e3855.af1028","type":"ui_chart","z":"c9ea9bc1.58fd68","name":"Moisture Chart","group":"a3e71755.838d88","order":14,"width":0,"height":0,"label":"Moisture","chartType":"line","legend":"false","xformat":"HH:mm:ss","interpolate":"linear","nodata":"","dot":true,"ymin":"0","ymax":"1024","removeOlder":1,"removeOlderPoints":"","removeOlderUnit":"86400","cutout":0,"useOneColor":false,"colors":["#1f77b4","#aec7e8","#ff7f0e","#2ca02c","#98df8a","#d62728","#ff9896","#9467bd","#c5b0d5"],"useOldStyle":false,"x":1220,"y":820,"wires":[[],[]]},{"id":"4829b01b.8e85e","type":"function","z":"c9ea9bc1.58fd68","name":"Save MOISTURE value","func":"flow.set(\"moisture\", msg.payload);\nreturn msg;","outputs":1,"noerr":0,"x":1250,"y":860,"wires":[[]]},{"id":"2860f894.1fd7e8","type":"ttn app","z":"","appId":"farm_sensor_network","accessKey":"your-access-key","discovery":"discovery.thethingsnetwork.org:1900"},{"id":"a3e71755.838d88","type":"ui_group","z":"","name":"ENVIRONMENTAL SENSOR","tab":"f26ca952.50b6d8","disp":true,"width":"8","collapse":true},{"id":"8389b2aa.13894","type":"ui_group","z":"","name":"SENSOR GAUGE","tab":"f26ca952.50b6d8","disp":true,"width":"7","collapse":true},{"id":"f26ca952.50b6d8","type":"ui_tab","z":"","name":"TTN","icon":"dashboard","disabled":false,"hidden":false}] +[{"id":"8ad521ed.ea0c4","type":"ttn uplink","z":"c9ea9bc1.58fd68","name":"Farm Sensor Network","app":"2860f894.1fd7e8","dev_id":"","field":"","x":220,"y":580,"wires":[["36b90326.4d9e8c"]]},{"id":"1ad0e4c9.9f91ab","type":"function","z":"c9ea9bc1.58fd68","name":"Extract LIGHT value","func":"var light = msg.payload.light;\nmsg.payload = light;\nreturn msg;","outputs":1,"noerr":0,"x":880,"y":560,"wires":[["6d2d3359.bd0eec","a6c068f5.820c68"]]},{"id":"6d2d3359.bd0eec","type":"ui_chart","z":"c9ea9bc1.58fd68","name":"Light Chart","group":"a3e71755.838d88","order":14,"width":0,"height":0,"label":"Light","chartType":"line","legend":"false","xformat":"HH:mm:ss","interpolate":"linear","nodata":"","dot":true,"ymin":"0","ymax":"1024","removeOlder":1,"removeOlderPoints":"","removeOlderUnit":"86400","cutout":0,"useOneColor":false,"colors":["#1f77b4","#aec7e8","#ff7f0e","#2ca02c","#98df8a","#d62728","#ff9896","#9467bd","#c5b0d5"],"useOldStyle":false,"x":1200,"y":520,"wires":[[],[]]},{"id":"36b90326.4d9e8c","type":"function","z":"c9ea9bc1.58fd68","name":"Extract Decoded Payload","func":"var value = msg.payload.payload;\nmsg.payload = value;\nmsg.topic = msg.dev_id;\nreturn msg;","outputs":1,"noerr":0,"x":460,"y":620,"wires":[["396b66c6.c58b8a"]]},{"id":"396b66c6.c58b8a","type":"json","z":"c9ea9bc1.58fd68","name":"JSON Parse","property":"payload","action":"","pretty":true,"x":650,"y":560,"wires":[["1ad0e4c9.9f91ab","db3bdfa9.f83f7","c46d41ac.9433","823b2cb9.0a4d8","2d5d8598.029f6a"]]},{"id":"db3bdfa9.f83f7","type":"debug","z":"c9ea9bc1.58fd68","name":"","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"false","x":830,"y":520,"wires":[]},{"id":"c46d41ac.9433","type":"function","z":"c9ea9bc1.58fd68","name":"Extract TEMPERATURE value","func":"var temp = msg.payload.temp;\nmsg.payload = temp;\nreturn msg;","outputs":1,"noerr":0,"x":910,"y":600,"wires":[["5378f82b.09f368","538a8ef5.794a3"]]},{"id":"823b2cb9.0a4d8","type":"function","z":"c9ea9bc1.58fd68","name":"Extract HUMIDITY value","func":"var hum = msg.payload.hum;\nmsg.payload = hum;\nreturn msg;","outputs":1,"noerr":0,"x":890,"y":640,"wires":[["8f2c98bd.4f1c98","4f71ad75.26f1d4"]]},{"id":"5378f82b.09f368","type":"ui_chart","z":"c9ea9bc1.58fd68","name":"Temp Chart","group":"a3e71755.838d88","order":14,"width":0,"height":0,"label":"Temperature","chartType":"line","legend":"false","xformat":"HH:mm:ss","interpolate":"linear","nodata":"","dot":true,"ymin":"-5","ymax":"45","removeOlder":1,"removeOlderPoints":"","removeOlderUnit":"86400","cutout":0,"useOneColor":false,"colors":["#1f77b4","#aec7e8","#ff7f0e","#2ca02c","#98df8a","#d62728","#ff9896","#9467bd","#c5b0d5"],"useOldStyle":false,"x":1200,"y":620,"wires":[[],[]]},{"id":"8f2c98bd.4f1c98","type":"ui_chart","z":"c9ea9bc1.58fd68","name":"Humidity Chart","group":"a3e71755.838d88","order":14,"width":0,"height":0,"label":"Humidity","chartType":"line","legend":"false","xformat":"HH:mm:ss","interpolate":"linear","nodata":"","dot":true,"ymin":"0","ymax":"100","removeOlder":1,"removeOlderPoints":"","removeOlderUnit":"86400","cutout":0,"useOneColor":false,"colors":["#1f77b4","#aec7e8","#ff7f0e","#2ca02c","#98df8a","#d62728","#ff9896","#9467bd","#c5b0d5"],"useOldStyle":false,"x":1210,"y":720,"wires":[[],[]]},{"id":"a6c068f5.820c68","type":"ui_gauge","z":"c9ea9bc1.58fd68","name":"","group":"8389b2aa.13894","order":14,"width":"0","height":"0","gtype":"gauge","title":"","label":"","format":"{{value}}","min":0,"max":"1024","colors":["#000000","#757572","#ffffff"],"seg1":"","seg2":"","x":1180,"y":480,"wires":[]},{"id":"538a8ef5.794a3","type":"ui_gauge","z":"c9ea9bc1.58fd68","name":"","group":"8389b2aa.13894","order":15,"width":0,"height":0,"gtype":"gauge","title":"","label":"°C","format":"{{value}}","min":"-5","max":"45","colors":["#34a5f2","#09e600","#ca3838"],"seg1":"10","seg2":"28","x":1180,"y":580,"wires":[]},{"id":"4f71ad75.26f1d4","type":"ui_gauge","z":"c9ea9bc1.58fd68","name":"","group":"8389b2aa.13894","order":16,"width":0,"height":0,"gtype":"gauge","title":"","label":"%","format":"{{value}}","min":0,"max":"100","colors":["#91edf5","#008fe6","#0005f0"],"seg1":"","seg2":"","x":1180,"y":680,"wires":[]},{"id":"2d5d8598.029f6a","type":"function","z":"c9ea9bc1.58fd68","name":"Extract MOISTURE value","func":"var mois = msg.payload.mois;\nmsg.payload = mois;\nreturn msg;","outputs":1,"noerr":0,"x":900,"y":680,"wires":[["ad89379.1f100c8","307e3855.af1028","4829b01b.8e85e"]]},{"id":"ad89379.1f100c8","type":"ui_gauge","z":"c9ea9bc1.58fd68","name":"","group":"8389b2aa.13894","order":16,"width":0,"height":0,"gtype":"gauge","title":"","label":"%","format":"{{value}}","min":0,"max":"1024","colors":["#91edf5","#008fe6","#0005f0"],"seg1":"","seg2":"","x":1190,"y":780,"wires":[]},{"id":"307e3855.af1028","type":"ui_chart","z":"c9ea9bc1.58fd68","name":"Moisture Chart","group":"a3e71755.838d88","order":14,"width":0,"height":0,"label":"Moisture","chartType":"line","legend":"false","xformat":"HH:mm:ss","interpolate":"linear","nodata":"","dot":true,"ymin":"0","ymax":"1024","removeOlder":1,"removeOlderPoints":"","removeOlderUnit":"86400","cutout":0,"useOneColor":false,"colors":["#1f77b4","#aec7e8","#ff7f0e","#2ca02c","#98df8a","#d62728","#ff9896","#9467bd","#c5b0d5"],"useOldStyle":false,"x":1220,"y":820,"wires":[[],[]]},{"id":"4829b01b.8e85e","type":"function","z":"c9ea9bc1.58fd68","name":"Save MOISTURE value","func":"flow.set(\"moisture\", msg.payload);\nreturn msg;","outputs":1,"noerr":0,"x":1250,"y":860,"wires":[[]]},{"id":"2860f894.1fd7e8","type":"ttn app","z":"","appId":"farm_sensor_network","accessKey":"your-access-key","discovery":"discovery.thethingsnetwork.org:1900"},{"id":"a3e71755.838d88","type":"ui_group","z":"","name":"ENVIRONMENTAL SENSOR","tab":"f26ca952.50b6d8","disp":true,"width":"8","collapse":true},{"id":"8389b2aa.13894","type":"ui_group","z":"","name":"SENSOR GAUGE","tab":"f26ca952.50b6d8","disp":true,"width":"7","collapse":true},{"id":"f26ca952.50b6d8","type":"ui_tab","z":"","name":"TTN","icon":"dashboard","disabled":false,"hidden":false}] ``` Just select and copy it; then click on the burger icon on the top left corner, and choose *Import* and then *Clipboard* From cbf0c9f04f5dc206ce584790e2a76ed846651769 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Juli=C3=A1n=20Caro=20Linares?= Date: Thu, 9 Mar 2023 10:53:12 +0100 Subject: [PATCH 4/8] Revert "General: Spell Check Fix (Global Repo)" --- .../Genuino101CurieBLEHeartRateMonitor.md | 2 +- .../01.basics/05.digital-analog-pins/digital-analog-pins.md | 2 +- .../control-two-relays-over-the-internet.md | 2 +- .../localize-your-board-with-an-sms.md | 2 +- .../lorawan-farming-with-mkr-wan-1310.md | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) diff --git a/content/library-examples/curie-ble/Genuino101CurieBLEHeartRateMonitor/Genuino101CurieBLEHeartRateMonitor.md b/content/library-examples/curie-ble/Genuino101CurieBLEHeartRateMonitor/Genuino101CurieBLEHeartRateMonitor.md index fd31a2702a..a73dc9e1ec 100644 --- a/content/library-examples/curie-ble/Genuino101CurieBLEHeartRateMonitor/Genuino101CurieBLEHeartRateMonitor.md +++ b/content/library-examples/curie-ble/Genuino101CurieBLEHeartRateMonitor/Genuino101CurieBLEHeartRateMonitor.md @@ -48,7 +48,7 @@ Set up the Arduino software as described in [Getting Started with Arduino 101](h ## Where to Go from Here -The Bluetooth® Low Energy includes [many other services](https://developer.bluetooth.org/gatt/services/Pages/ServicesHome.aspx) with which you can experiment, such as [Alert Notification Service](https://developer.bluetooth.org/gatt/services/Pages/ServiceViewer.aspx?u=org.bluetooth.service.alert_notification.xml), [Environmental Sensing](https://developer.bluetooth.org/gatt/services/Pages/ServiceViewer.aspx?u=org.bluetooth.service.environmental_sensing.xml), and [AutomationIO](https://developer.bluetooth.org/gatt/services/Pages/ServiceViewer.aspx?u=org.bluetooth.service.automation_io.xml), in which you can expose all of your Arduino's inputs and control its outputs. +The Bluetooth® Low Energy includes [many other services](https://developer.bluetooth.org/gatt/services/Pages/ServicesHome.aspx) with which you can experiment, such as [Alert Notificaion Service](https://developer.bluetooth.org/gatt/services/Pages/ServiceViewer.aspx?u=org.bluetooth.service.alert_notification.xml), [Environmental Sensing](https://developer.bluetooth.org/gatt/services/Pages/ServiceViewer.aspx?u=org.bluetooth.service.environmental_sensing.xml), and [AutomationIO](https://developer.bluetooth.org/gatt/services/Pages/ServiceViewer.aspx?u=org.bluetooth.service.automation_io.xml), in which you can expose all of your Arduino's inputs and control its outputs. This tutorial uses nRF Toolbox, which allows the use of 9 services. For more advanced capabilities, other discluded services, as well the CurieImu library's LED examples, we recommend using [LightBlue for iOS](https://itunes.apple.com/it/app/lightblue-explorer-bluetooth/id557428110?mt=8) or [nRF Control Panel for Android](https://play.google.com/store/apps/details?id=no.nordicsemi.android.mcp&hl=it). ## Code diff --git a/content/micropython/01.basics/05.digital-analog-pins/digital-analog-pins.md b/content/micropython/01.basics/05.digital-analog-pins/digital-analog-pins.md index 5b66e6d653..28a3af518a 100644 --- a/content/micropython/01.basics/05.digital-analog-pins/digital-analog-pins.md +++ b/content/micropython/01.basics/05.digital-analog-pins/digital-analog-pins.md @@ -90,7 +90,7 @@ while True: ## Analog Pins -An example of analog pin is the ADC class, that supplies an interface to analog-to-digital converters, and figures a single endpoint that can sample a continuous voltage and convert it to a discretised value. +An example of analog pin is the ADC class, that supplies an interface to analog-to-digital convertors, and figures a single endpoint that can sample a continuous voltage and convert it to a discretised value. There are four methods to use inside the ADC class: `ADC.init`, `ADC.block()`, `ADC.read_16()` and `ADC.read_uv()`. diff --git a/content/tutorials/projects/control-two-relays-over-the-internet/control-two-relays-over-the-internet.md b/content/tutorials/projects/control-two-relays-over-the-internet/control-two-relays-over-the-internet.md index d47c3bcc6a..3db0a0a58d 100644 --- a/content/tutorials/projects/control-two-relays-over-the-internet/control-two-relays-over-the-internet.md +++ b/content/tutorials/projects/control-two-relays-over-the-internet/control-two-relays-over-the-internet.md @@ -157,7 +157,7 @@ Serial.println("LED on V1: on"); Before you can get everything up and running you should have filled the **arduino_secrets.h** piece of code with the auth token got by email and the credentials to access the internet over GPRS. With this data, the sketch can be uploaded to the MKR GSM 1400. -Launch the Blynk application on your smartphone, then select the project created with the QR code and tap on the "play" icon on the right of the top bar. You should see the icon of a small board with a red blob on it: it is the status of the connection with your board. Load the sketch and wait for the connection process to happen. You may want to monitor it through the Serial Monitor. +Launch the Blynk application on your smartphone, then select the project created with the QR code and tap on the "play" icon on the right of the top bar. You should see the icon of a small board with a red blob on it: it is the status of the connection with your board. Load the sketch and wait for the connection process to happen. You may want to monitor it trhough the Serial Monitor. Anyway, when the board connects to the Blynk server, the red blob should disappear and on the interface you should start to see the virtual LED blinking with a slow pace. You are connected! diff --git a/content/tutorials/projects/localize-your-board-with-an-sms/localize-your-board-with-an-sms.md b/content/tutorials/projects/localize-your-board-with-an-sms/localize-your-board-with-an-sms.md index 0e9123d822..863732bde1 100644 --- a/content/tutorials/projects/localize-your-board-with-an-sms/localize-your-board-with-an-sms.md +++ b/content/tutorials/projects/localize-your-board-with-an-sms/localize-your-board-with-an-sms.md @@ -73,7 +73,7 @@ The `measureLocation()` queries the module to retry the coordinates by cellular //global variable used for location management String GSMlatitude = "0.000000"; String GSMlongitude = "0.000000"; -// This function use the location's APIs to get the device coordinates and update the global variable if all the requirement are satisfied +// This function use the location's APIs to get the device coordinates and update the globa variable if all the requirement are satisfied void measureLocation() { unsigned long timeout = millis(); while (millis() - timeout < 45000) { diff --git a/content/tutorials/projects/lorawan-farming-with-mkr-wan-1310/lorawan-farming-with-mkr-wan-1310.md b/content/tutorials/projects/lorawan-farming-with-mkr-wan-1310/lorawan-farming-with-mkr-wan-1310.md index c0ce9cb874..1c574082ef 100644 --- a/content/tutorials/projects/lorawan-farming-with-mkr-wan-1310/lorawan-farming-with-mkr-wan-1310.md +++ b/content/tutorials/projects/lorawan-farming-with-mkr-wan-1310/lorawan-farming-with-mkr-wan-1310.md @@ -195,7 +195,7 @@ Connect then in the right order the nodes: you should have now something like th Here you can find this flow ready to be imported in your Node-RED! ```arduino -[{"id":"8ad521ed.ea0c4","type":"ttn uplink","z":"c9ea9bc1.58fd68","name":"Farm Sensor Network","app":"2860f894.1fd7e8","dev_id":"","field":"","x":220,"y":580,"wires":[["36b90326.4d9e8c"]]},{"id":"1ad0e4c9.9f91ab","type":"function","z":"c9ea9bc1.58fd68","name":"Extract LIGHT value","func":"var light = msg.payload.light;\nmsg.payload = light;\nreturn msg;","outputs":1,"noerr":0,"x":880,"y":560,"wires":[["6d2d3359.bd0eec","a6c068f5.820c68"]]},{"id":"6d2d3359.bd0eec","type":"ui_chart","z":"c9ea9bc1.58fd68","name":"Light Chart","group":"a3e71755.838d88","order":14,"width":0,"height":0,"label":"Light","chartType":"line","legend":"false","xformat":"HH:mm:ss","interpolate":"linear","nodata":"","dot":true,"ymin":"0","ymax":"1024","removeOlder":1,"removeOlderPoints":"","removeOlderUnit":"86400","cutout":0,"useOneColor":false,"colors":["#1f77b4","#aec7e8","#ff7f0e","#2ca02c","#98df8a","#d62728","#ff9896","#9467bd","#c5b0d5"],"useOldStyle":false,"x":1200,"y":520,"wires":[[],[]]},{"id":"36b90326.4d9e8c","type":"function","z":"c9ea9bc1.58fd68","name":"Extract Decoded Payload","func":"var value = msg.payload.payload;\nmsg.payload = value;\nmsg.topic = msg.dev_id;\nreturn msg;","outputs":1,"noerr":0,"x":460,"y":620,"wires":[["396b66c6.c58b8a"]]},{"id":"396b66c6.c58b8a","type":"json","z":"c9ea9bc1.58fd68","name":"JSON Parse","property":"payload","action":"","pretty":true,"x":650,"y":560,"wires":[["1ad0e4c9.9f91ab","db3bdfa9.f83f7","c46d41ac.9433","823b2cb9.0a4d8","2d5d8598.029f6a"]]},{"id":"db3bdfa9.f83f7","type":"debug","z":"c9ea9bc1.58fd68","name":"","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"false","x":830,"y":520,"wires":[]},{"id":"c46d41ac.9433","type":"function","z":"c9ea9bc1.58fd68","name":"Extract TEMPERATURE value","func":"var temp = msg.payload.temp;\nmsg.payload = temp;\nreturn msg;","outputs":1,"noerr":0,"x":910,"y":600,"wires":[["5378f82b.09f368","538a8ef5.794a3"]]},{"id":"823b2cb9.0a4d8","type":"function","z":"c9ea9bc1.58fd68","name":"Extract HUMIDITY value","func":"var hum = msg.payload.hum;\nmsg.payload = hum;\nreturn msg;","outputs":1,"noerr":0,"x":890,"y":640,"wires":[["8f2c98bd.4f1c98","4f71ad75.26f1d4"]]},{"id":"5378f82b.09f368","type":"ui_chart","z":"c9ea9bc1.58fd68","name":"Temp Chart","group":"a3e71755.838d88","order":14,"width":0,"height":0,"label":"Temperature","chartType":"line","legend":"false","xformat":"HH:mm:ss","interpolate":"linear","nodata":"","dot":true,"ymin":"-5","ymax":"45","removeOlder":1,"removeOlderPoints":"","removeOlderUnit":"86400","cutout":0,"useOneColor":false,"colors":["#1f77b4","#aec7e8","#ff7f0e","#2ca02c","#98df8a","#d62728","#ff9896","#9467bd","#c5b0d5"],"useOldStyle":false,"x":1200,"y":620,"wires":[[],[]]},{"id":"8f2c98bd.4f1c98","type":"ui_chart","z":"c9ea9bc1.58fd68","name":"Humidity Chart","group":"a3e71755.838d88","order":14,"width":0,"height":0,"label":"Humidity","chartType":"line","legend":"false","xformat":"HH:mm:ss","interpolate":"linear","nodata":"","dot":true,"ymin":"0","ymax":"100","removeOlder":1,"removeOlderPoints":"","removeOlderUnit":"86400","cutout":0,"useOneColor":false,"colors":["#1f77b4","#aec7e8","#ff7f0e","#2ca02c","#98df8a","#d62728","#ff9896","#9467bd","#c5b0d5"],"useOldStyle":false,"x":1210,"y":720,"wires":[[],[]]},{"id":"a6c068f5.820c68","type":"ui_gauge","z":"c9ea9bc1.58fd68","name":"","group":"8389b2aa.13894","order":14,"width":"0","height":"0","gtype":"gauge","title":"","label":"","format":"{{value}}","min":0,"max":"1024","colors":["#000000","#757572","#ffffff"],"seg1":"","seg2":"","x":1180,"y":480,"wires":[]},{"id":"538a8ef5.794a3","type":"ui_gauge","z":"c9ea9bc1.58fd68","name":"","group":"8389b2aa.13894","order":15,"width":0,"height":0,"gtype":"gauge","title":"","label":"°C","format":"{{value}}","min":"-5","max":"45","colors":["#34a5f2","#09e600","#ca3838"],"seg1":"10","seg2":"28","x":1180,"y":580,"wires":[]},{"id":"4f71ad75.26f1d4","type":"ui_gauge","z":"c9ea9bc1.58fd68","name":"","group":"8389b2aa.13894","order":16,"width":0,"height":0,"gtype":"gauge","title":"","label":"%","format":"{{value}}","min":0,"max":"100","colors":["#91edf5","#008fe6","#0005f0"],"seg1":"","seg2":"","x":1180,"y":680,"wires":[]},{"id":"2d5d8598.029f6a","type":"function","z":"c9ea9bc1.58fd68","name":"Extract MOISTURE value","func":"var mois = msg.payload.mois;\nmsg.payload = mois;\nreturn msg;","outputs":1,"noerr":0,"x":900,"y":680,"wires":[["ad89379.1f100c8","307e3855.af1028","4829b01b.8e85e"]]},{"id":"ad89379.1f100c8","type":"ui_gauge","z":"c9ea9bc1.58fd68","name":"","group":"8389b2aa.13894","order":16,"width":0,"height":0,"gtype":"gauge","title":"","label":"%","format":"{{value}}","min":0,"max":"1024","colors":["#91edf5","#008fe6","#0005f0"],"seg1":"","seg2":"","x":1190,"y":780,"wires":[]},{"id":"307e3855.af1028","type":"ui_chart","z":"c9ea9bc1.58fd68","name":"Moisture Chart","group":"a3e71755.838d88","order":14,"width":0,"height":0,"label":"Moisture","chartType":"line","legend":"false","xformat":"HH:mm:ss","interpolate":"linear","nodata":"","dot":true,"ymin":"0","ymax":"1024","removeOlder":1,"removeOlderPoints":"","removeOlderUnit":"86400","cutout":0,"useOneColor":false,"colors":["#1f77b4","#aec7e8","#ff7f0e","#2ca02c","#98df8a","#d62728","#ff9896","#9467bd","#c5b0d5"],"useOldStyle":false,"x":1220,"y":820,"wires":[[],[]]},{"id":"4829b01b.8e85e","type":"function","z":"c9ea9bc1.58fd68","name":"Save MOISTURE value","func":"flow.set(\"moisture\", msg.payload);\nreturn msg;","outputs":1,"noerr":0,"x":1250,"y":860,"wires":[[]]},{"id":"2860f894.1fd7e8","type":"ttn app","z":"","appId":"farm_sensor_network","accessKey":"your-access-key","discovery":"discovery.thethingsnetwork.org:1900"},{"id":"a3e71755.838d88","type":"ui_group","z":"","name":"ENVIRONMENTAL SENSOR","tab":"f26ca952.50b6d8","disp":true,"width":"8","collapse":true},{"id":"8389b2aa.13894","type":"ui_group","z":"","name":"SENSOR GAUGE","tab":"f26ca952.50b6d8","disp":true,"width":"7","collapse":true},{"id":"f26ca952.50b6d8","type":"ui_tab","z":"","name":"TTN","icon":"dashboard","disabled":false,"hidden":false}] +[{"id":"8ad521ed.ea0c4","type":"ttn uplink","z":"c9ea9bc1.58fd68","name":"Farm Sensor Network","app":"2860f894.1fd7e8","dev_id":"","field":"","x":220,"y":580,"wires":[["36b90326.4d9e8c"]]},{"id":"1ad0e4c9.9f91ab","type":"function","z":"c9ea9bc1.58fd68","name":"Extract LIGHT value","func":"var light = msg.payload.light;\nmsg.payload = light;\nreturn msg;","outputs":1,"noerr":0,"x":880,"y":560,"wires":[["6d2d3359.bd0eec","a6c068f5.820c68"]]},{"id":"6d2d3359.bd0eec","type":"ui_chart","z":"c9ea9bc1.58fd68","name":"Light Chart","group":"a3e71755.838d88","order":14,"width":0,"height":0,"label":"Light","chartType":"line","legend":"false","xformat":"HH:mm:ss","interpolate":"linear","nodata":"","dot":true,"ymin":"0","ymax":"1024","removeOlder":1,"removeOlderPoints":"","removeOlderUnit":"86400","cutout":0,"useOneColor":false,"colors":["#1f77b4","#aec7e8","#ff7f0e","#2ca02c","#98df8a","#d62728","#ff9896","#9467bd","#c5b0d5"],"useOldStyle":false,"x":1200,"y":520,"wires":[[],[]]},{"id":"36b90326.4d9e8c","type":"function","z":"c9ea9bc1.58fd68","name":"Extract Decoded Payload","func":"var value = msg.payload.payload;\nmsg.payload = value;\nmsg.topic = msg.dev_id;\nreturn msg;","outputs":1,"noerr":0,"x":460,"y":620,"wires":[["396b66c6.c58b8a"]]},{"id":"396b66c6.c58b8a","type":"json","z":"c9ea9bc1.58fd68","name":"JSON Parse","property":"payload","action":"","pretty":true,"x":650,"y":560,"wires":[["1ad0e4c9.9f91ab","db3bdfa9.f83f7","c46d41ac.9433","823b2cb9.0a4d8","2d5d8598.029f6a"]]},{"id":"db3bdfa9.f83f7","type":"debug","z":"c9ea9bc1.58fd68","name":"","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"false","x":830,"y":520,"wires":[]},{"id":"c46d41ac.9433","type":"function","z":"c9ea9bc1.58fd68","name":"Extract TEMPERATURE value","func":"var temp = msg.payload.temp;\nmsg.payload = temp;\nreturn msg;","outputs":1,"noerr":0,"x":910,"y":600,"wires":[["5378f82b.09f368","538a8ef5.794a3"]]},{"id":"823b2cb9.0a4d8","type":"function","z":"c9ea9bc1.58fd68","name":"Extract HUMIDITY value","func":"var hum = msg.payload.hum;\nmsg.payload = hum;\nreturn msg;","outputs":1,"noerr":0,"x":890,"y":640,"wires":[["8f2c98bd.4f1c98","4f71ad75.26f1d4"]]},{"id":"5378f82b.09f368","type":"ui_chart","z":"c9ea9bc1.58fd68","name":"Temp Chart","group":"a3e71755.838d88","order":14,"width":0,"height":0,"label":"Temperature","chartType":"line","legend":"false","xformat":"HH:mm:ss","interpolate":"linear","nodata":"","dot":true,"ymin":"-5","ymax":"45","removeOlder":1,"removeOlderPoints":"","removeOlderUnit":"86400","cutout":0,"useOneColor":false,"colors":["#1f77b4","#aec7e8","#ff7f0e","#2ca02c","#98df8a","#d62728","#ff9896","#9467bd","#c5b0d5"],"useOldStyle":false,"x":1200,"y":620,"wires":[[],[]]},{"id":"8f2c98bd.4f1c98","type":"ui_chart","z":"c9ea9bc1.58fd68","name":"Humidity Chart","group":"a3e71755.838d88","order":14,"width":0,"height":0,"label":"Humidity","chartType":"line","legend":"false","xformat":"HH:mm:ss","interpolate":"linear","nodata":"","dot":true,"ymin":"0","ymax":"100","removeOlder":1,"removeOlderPoints":"","removeOlderUnit":"86400","cutout":0,"useOneColor":false,"colors":["#1f77b4","#aec7e8","#ff7f0e","#2ca02c","#98df8a","#d62728","#ff9896","#9467bd","#c5b0d5"],"useOldStyle":false,"x":1210,"y":720,"wires":[[],[]]},{"id":"a6c068f5.820c68","type":"ui_gauge","z":"c9ea9bc1.58fd68","name":"","group":"8389b2aa.13894","order":14,"width":"0","height":"0","gtype":"gage","title":"","label":"","format":"{{value}}","min":0,"max":"1024","colors":["#000000","#757572","#ffffff"],"seg1":"","seg2":"","x":1180,"y":480,"wires":[]},{"id":"538a8ef5.794a3","type":"ui_gauge","z":"c9ea9bc1.58fd68","name":"","group":"8389b2aa.13894","order":15,"width":0,"height":0,"gtype":"gage","title":"","label":"°C","format":"{{value}}","min":"-5","max":"45","colors":["#34a5f2","#09e600","#ca3838"],"seg1":"10","seg2":"28","x":1180,"y":580,"wires":[]},{"id":"4f71ad75.26f1d4","type":"ui_gauge","z":"c9ea9bc1.58fd68","name":"","group":"8389b2aa.13894","order":16,"width":0,"height":0,"gtype":"gage","title":"","label":"%","format":"{{value}}","min":0,"max":"100","colors":["#91edf5","#008fe6","#0005f0"],"seg1":"","seg2":"","x":1180,"y":680,"wires":[]},{"id":"2d5d8598.029f6a","type":"function","z":"c9ea9bc1.58fd68","name":"Extract MOISTURE value","func":"var mois = msg.payload.mois;\nmsg.payload = mois;\nreturn msg;","outputs":1,"noerr":0,"x":900,"y":680,"wires":[["ad89379.1f100c8","307e3855.af1028","4829b01b.8e85e"]]},{"id":"ad89379.1f100c8","type":"ui_gauge","z":"c9ea9bc1.58fd68","name":"","group":"8389b2aa.13894","order":16,"width":0,"height":0,"gtype":"gage","title":"","label":"%","format":"{{value}}","min":0,"max":"1024","colors":["#91edf5","#008fe6","#0005f0"],"seg1":"","seg2":"","x":1190,"y":780,"wires":[]},{"id":"307e3855.af1028","type":"ui_chart","z":"c9ea9bc1.58fd68","name":"Moisture Chart","group":"a3e71755.838d88","order":14,"width":0,"height":0,"label":"Moisture","chartType":"line","legend":"false","xformat":"HH:mm:ss","interpolate":"linear","nodata":"","dot":true,"ymin":"0","ymax":"1024","removeOlder":1,"removeOlderPoints":"","removeOlderUnit":"86400","cutout":0,"useOneColor":false,"colors":["#1f77b4","#aec7e8","#ff7f0e","#2ca02c","#98df8a","#d62728","#ff9896","#9467bd","#c5b0d5"],"useOldStyle":false,"x":1220,"y":820,"wires":[[],[]]},{"id":"4829b01b.8e85e","type":"function","z":"c9ea9bc1.58fd68","name":"Save MOISTURE value","func":"flow.set(\"moisture\", msg.payload);\nreturn msg;","outputs":1,"noerr":0,"x":1250,"y":860,"wires":[[]]},{"id":"2860f894.1fd7e8","type":"ttn app","z":"","appId":"farm_sensor_network","accessKey":"your-access-key","discovery":"discovery.thethingsnetwork.org:1900"},{"id":"a3e71755.838d88","type":"ui_group","z":"","name":"ENVIRONMENTAL SENSOR","tab":"f26ca952.50b6d8","disp":true,"width":"8","collapse":true},{"id":"8389b2aa.13894","type":"ui_group","z":"","name":"SENSOR GAUGE","tab":"f26ca952.50b6d8","disp":true,"width":"7","collapse":true},{"id":"f26ca952.50b6d8","type":"ui_tab","z":"","name":"TTN","icon":"dashboard","disabled":false,"hidden":false}] ``` Just select and copy it; then click on the burger icon on the top left corner, and choose *Import* and then *Clipboard* From 67fe9b0a6324defeb3a9262550420ffc56a998fe Mon Sep 17 00:00:00 2001 From: TaddyHC Date: Fri, 10 Mar 2023 16:34:27 -0600 Subject: [PATCH 5/8] Initial Commit - Opta Family Block --- content/hardware/07.opta/family.md | 4 + content/hardware/07.opta/image-480.png | Bin 0 -> 61905 bytes content/hardware/07.opta/image.png | Bin 0 -> 61573 bytes .../hardware/07.opta/opta-family/category.md | 3 + .../opta-family}/opta/compatibility.yml | 0 .../opta/datasheet/assets/featured.png | Bin .../opta/datasheet/assets/opta_mechanical.svg | 0 .../opta/datasheet/assets/opta_panel.svg | 0 .../datasheet/assets/opta_wiring_modbus.svg | 0 .../opta-family}/opta/datasheet/datasheet.md | 1476 ++++++------- .../opta-family}/opta/features.md | 0 .../opta-family}/opta/image.svg | 0 .../opta-family}/opta/product.md | 0 .../opta-family}/opta/tech-specs.md | 0 .../opta-family}/opta/tech-specs.yml | 0 .../assets/opta-ble.svg | 0 .../assets/opta-ethernet.svg | 0 .../assets/opta-wifi.svg | 0 .../getting-started-connectivity/content.md | 0 .../assets/Opta_Modbus_RTU_Example.zip | Bin .../assets/opta-modbus-client.svg | 0 .../assets/opta-modbus-connection.svg | 0 .../content.md | 1006 ++++----- .../assets/Opta_RS485_Example.zip | Bin .../assets/opta-modbus-connection.svg | 0 .../getting-started-with-rs485/content.md | 462 ++--- .../hero-banner.png | Bin .../assets/opta-analog-inputs.svg | 0 .../assets/opta-clean-contact.svg | 0 .../assets/opta-core-install.png | Bin .../assets/opta-device-LED.svg | 0 .../assets/opta-device-button.svg | 0 .../getting-started/assets/opta-device.svg | 0 .../assets/opta-out-relays.svg | 0 .../assets/opta-voltage-pins.svg | 0 .../opta/tutorials/getting-started/content.md | 0 .../assets/application_representation.svg | 0 .../assets/cloud_integration.svg | 0 .../assets/electrical_connections.svg | 0 .../assets/tank-level-monitoring-sketch.zip | Bin .../tutorials/tank-level-app-note/content.md | 0 .../tank-level-app-note/hero-banner.png | Bin .../braccio-carrier/compatibility.yml | 0 .../assets/Block_Diagram_Braccio_Carrier.svg | 0 .../assets/Power_Tree_Braccio_Carrier.jpg | Bin .../System_Block_Diagram_Braccio_Carrier.jpg | Bin .../datasheet/assets/braccio-connectors.svg | 0 .../datasheet/assets/braccio-mount.svg | 0 .../datasheet/assets/braccio-outline.svg | 0 .../datasheet/assets/braccio-pinout.png | Bin .../datasheet/assets/featured.png | Bin .../braccio-carrier/datasheet/datasheet.md | 0 .../downloads/ABX00032-dxf.zip | Bin .../downloads/ABX00032-fritzing.fzpz | Bin .../downloads/ABX00032-full-pinout.pdf | Bin .../downloads/ABX00032-schematics.pdf | Bin .../downloads/ABX00032-stand-stl.zip | Bin .../downloads/ABX00032-step.zip | Bin .../carriers/braccio-carrier/essentials.md | 0 .../carriers/braccio-carrier/features.md | 0 .../carriers/braccio-carrier/image.svg | 0 .../interactive/ABX00032-pinout.png | Bin .../carriers/braccio-carrier/product.md | 0 .../carriers/braccio-carrier/tech-specs.md | 0 .../carriers/braccio-carrier/tech-specs.yml | 0 .../{07.edu => 08.edu}/carriers/category.md | 0 content/hardware/{07.edu => 08.edu}/family.md | 0 .../hardware/{07.edu => 08.edu}/image-480.png | Bin content/hardware/{07.edu => 08.edu}/image.png | Bin .../hardware/{08.kits => 09.kits}/family.md | 0 .../{08.kits => 09.kits}/image-480.png | Bin .../hardware/{08.kits => 09.kits}/image.png | Bin .../{08.kits => 09.kits}/maker/category.md | 0 .../maker/iot-bundle}/compatibility.yml | 0 .../maker/iot-bundle/features.md | 94 +- .../maker/iot-bundle/image.svg | 0 .../maker/iot-bundle/product.md | 10 +- .../maker/iot-bundle/tech-specs.md | 0 .../maker/iot-bundle/tech-specs.yml | 66 +- .../i-love-you-pillow/assets/_ypE8fl7Ln6.png | Bin .../assets/circuit_tLcnUy2ifl.png | Bin .../assets/love-you-pillow-01_VoyWPl8L6l.gif | Bin .../assets/love-you-pillow-02_ydUsouV4bl.gif | Bin .../assets/pillow2-cover_eWFrQi0MOT.png | Bin ...shot_2022-03-30_at_14_26_54_stYUq5y7c2.png | Bin ...creenshot_2022-11-23_140745_adGbm9cDej.png | Bin .../assets/template_overview.png | Bin .../tutorials/i-love-you-pillow/content.md | 0 .../i-love-you-pillow/hero-banner.png | Bin .../pavlovs-cat/assets/_mV3ZK8zeAh.png | Bin .../pavlovs-cat/assets/gif-cat_vCx1OHLrzl.gif | Bin .../assets/light_rp2040_w373rVgQAw.png | Bin .../assets/palvov-cat-01_FHBOz5Z3MA.gif | Bin .../pavlovs-cat/assets/palvov-cat-02.gif | Bin .../assets/palvov-cat-03_EJSoVjN9qB.gif | Bin .../assets/piezo_buzzer_rp2040_whR92Z3Wgx.png | Bin ...creenshot_2022-11-23_141459_JVW8zmmeP0.png | Bin .../assets/servo_motor_rp2040_PAcv0Yejb2.png | Bin .../pavlovs-cat/assets/template_overview.png | Bin .../tutorials/pavlovs-cat/content.md | 0 .../tutorials/pavlovs-cat/hero-banner.png | Bin .../plant-communicator/assets/_rdaslUwR6h.png | Bin .../diy-soil-moisture-rp2040_q2RlMGdgl9.png | Bin ...__temperature_sensor_rp2040_bfbwQp7XjU.png | Bin .../assets/plant_communicator_01.gif | Bin .../assets/plant_communicator_03__2_.gif | Bin .../assets/plant_communicator_04.gif | Bin ...creenshot_2022-11-23_141037_Q9gBcgrkER.png | Bin .../assets/template_overview.png | Bin .../tutorials/plant-communicator/content.md | 0 .../plant-communicator/hero-banner.png | Bin .../puzzlebox/assets/_VbBUKNXj0o.png | Bin .../cloudinstructions_rp2040_0AMlQHeGHs.gif | Bin .../assets/lcd_part_rp2040_wOrq2EKGuO.png | Bin ...ezo_buzzer_comeplete_rp2040_JAUtOjyKq1.png | Bin .../piezo_buzzer_part_rp2040_iaPHtGSH0X.png | Bin .../potentiometer_part_rp2040_q8hHfs8AIS.png | Bin .../puzzlebox/assets/puzzlebox_pi0UiMBngP.gif | Bin .../rgb_comeplete_rp2040_6AuNMnXduR.png | Bin .../assets/rgb_part_rp2040_4eGOKtRQgk.png | Bin .../assets/rgbled_s82wjxgcnf_1WXt8cDpSj.png | Bin .../assets/safe_combination_Xkek4QBhoy.gif | Bin ...creenshot_2022-11-17_095328_ujTWxb7Xtp.png | Bin ...creenshot_2022-11-23_141306_tsMoI77zJw.png | Bin ...ervo_motor_comeplete_rp2040_mXHekbPnRO.png | Bin .../servo_motor_part_rp2040_4ZqZ4C9F5w.png | Bin .../puzzlebox/assets/template_overview.png | Bin .../iot-bundle/tutorials/puzzlebox/content.md | 0 .../tutorials/puzzlebox/hero-banner.png | Bin .../tutorials/the-nerd/assets/_45dZFAyOab.png | Bin .../assets/nerd-cloud-setup_RC5c4S0ASc.gif | Bin ...creenshot_2022-11-18_175524_4XRWc1dHYc.png | Bin .../the-nerd/assets/template_overview.png | Bin .../the-nerd/assets/the_nerd_m3DggOdFBj.gif | Bin .../the_nerd_rp2040_dqr7egmpao_ESpsLy8iaq.png | Bin .../iot-bundle/tutorials/the-nerd/content.md | 0 .../tutorials/the-nerd/hero-banner.png | Bin .../Arduino_AKX00037-DoC_CE.pdf | Bin .../maker/make-your-uno-kit/compatibility.yml | 18 +- .../datasheet/assets/audioComponentsView.png | Bin .../datasheet/assets/boardOutline.svg | 0 .../datasheet/assets/featured.png | Bin .../datasheet/assets/fusionOutline.svg | 0 .../datasheet/assets/lowAudioSynth.png | Bin .../datasheet/assets/pinout.png | Bin .../datasheet/assets/powerTree.svg | 0 .../datasheet/assets/synthMounted.png | Bin .../datasheet/assets/synthOutline.svg | 0 .../datasheet/assets/synthPotentiometers.svg | 0 .../datasheet/assets/synthTopology.svg | 0 .../datasheet/assets/unoComponentsView.png | Bin .../datasheet/assets/unoOverview.png | Bin .../make-your-uno-kit/datasheet/datasheet.md | 0 .../downloads/AKX00037-cad-files.zip | Bin .../downloads/AKX00037-schematics.pdf | Bin .../downloads/ASX00037-full-pinout.pdf | Bin .../maker/make-your-uno-kit/features.md | 70 +- .../maker/make-your-uno-kit/image.svg | 0 .../interactive/ASX00037-pinout.png | Bin .../make-your-uno-kit/interactive/altium.zip | Bin .../maker/make-your-uno-kit/product.md | 14 +- .../maker/make-your-uno-kit/tech-specs.md | 0 .../maker/make-your-uno-kit/tech-specs.yml | 104 +- .../plant-watering-kit}/compatibility.yml | 14 +- .../maker/plant-watering-kit/features.md | 0 .../maker/plant-watering-kit/image.svg | 0 .../maker/plant-watering-kit/product.md | 0 .../maker/plant-watering-kit/tech-specs.md | 0 .../maker/plant-watering-kit/tech-specs.yml | 0 .../assets/cabletwisting.gif | Bin .../assets/completesetup.jpg | Bin .../assets/coverpage.png | Bin .../assets/dashboard-overview.png | Bin .../assets/dashboard_initial.png | Bin .../assets/step1.png | Bin .../assets/step2.png | Bin .../assets/step3.png | Bin .../assets/step4.png | Bin .../assets/step5.png | Bin .../assets/step6.png | Bin .../assets/step7.png | Bin .../assets/template_overview.png | Bin .../assets/things.png | Bin .../assets/ziptie.gif | Bin .../content.md | 0 .../hero-banner.png | Bin .../{09.mega => 10.mega}/boards/category.md | 0 ...Arduino_A000056-DoC_CE_without headers.pdf | Bin .../certifications/Arduino_A000062-DoC_CE.pdf | Bin .../Arduino_A000062-DoC_UKCA.pdf | Bin .../boards/due/compatibility.yml | 0 .../due/downloads/A000056-full-pinout.pdf | Bin .../boards/due/downloads/eagle-files.zip | Bin .../boards/due/downloads/fritzing.fzpz | Bin .../boards/due/downloads/schematics.pdf | Bin .../boards/due/essentials.md | 0 .../boards/due/features.md | 0 .../{09.mega => 10.mega}/boards/due/image.svg | 0 .../boards/due/interactive/A000056-pinout.png | Bin .../due/interactive/A000062-altium.zip.gpg | Bin .../boards/due/product.md | 0 .../boards/due/suggestions.md | 0 .../boards/due/tech-specs.md | 0 .../boards/due/tech-specs.yml | 0 .../due-extended-spi/due-extended-spi.md | 0 .../assets/DueMotorShieldFan.jpg | Bin .../due-motor-shield-dc.md | 0 .../keyboard-controller.md | 0 .../mouse-controller/assets/DueUSBPorts.png | Bin .../mouse-controller/mouse-controller.md | 0 .../due/tutorials/multiple-blinks/content.md | 0 .../assets/DueSimpleWaveform_fritzing.png | Bin .../assets/Duewaveforms.jpg | Bin .../assets/DueUSBPorts.png | Bin .../keyboard-controller.md | 0 .../simple-waveform-generator.md | 496 ++--- .../assets/Due16U2UpgradeSPI.jpg | Bin .../upgrading-16u2-due/upgrading-16u2-due.md | 180 +- .../boards/giga-r1-wifi/compatibility.yml | 0 .../assets/GIGA_R1_WiFi_Block_Diagram.png | Bin .../assets/GIGA_R1_WiFi_Power_Tree.png | Bin .../datasheet/assets/featured.png | Bin .../datasheet/assets/gigaMechanical.png | Bin .../datasheet/assets/gigaR1WiFiBottom.png | Bin .../datasheet/assets/gigaR1WiFiTop.png | Bin .../giga-r1-wifi/datasheet/datasheet.md | 0 .../downloads/ABX00063-cad-files.zip | Bin .../downloads/ABX00063-full-pinout.pdf | Bin .../downloads/ABX00063-pinout.png | Bin .../downloads/ABX00063-schematics.pdf | Bin .../boards/giga-r1-wifi/essentials.md | 0 .../boards/giga-r1-wifi/features.md | 0 .../boards/giga-r1-wifi/image.svg | 0 .../interactive/ABX00063-pinout.png | Bin .../giga-r1-wifi/interactive/altium.zip | Bin .../boards/giga-r1-wifi/product.md | 0 .../boards/giga-r1-wifi/tech-specs.md | 0 .../boards/giga-r1-wifi/tech-specs.yml | 0 .../tutorials/cheat-sheet/assets/BOOT0.png | Bin .../cheat-sheet/assets/STM32H747XI.png | Bin .../cheat-sheet/assets/audio-jack.png | Bin .../tutorials/cheat-sheet/assets/canpins.png | Bin .../tutorials/cheat-sheet/assets/i2cpins.png | Bin .../tutorials/cheat-sheet/assets/jtag.png | Bin .../cheat-sheet/assets/red_led_blink.gif | Bin .../tutorials/cheat-sheet/assets/rtc.png | Bin .../cheat-sheet/assets/schematics-spi.png | Bin .../tutorials/cheat-sheet/assets/spipins.png | Bin .../tutorials/cheat-sheet/assets/usb.png | Bin .../tutorials/cheat-sheet/assets/wifi.png | Bin .../tutorials/cheat-sheet/cheat-sheet.md | 0 .../tutorials/cheat-sheet/hero-banner.png | Bin .../tutorials/giga-audio/assets/adcs.png | Bin .../giga-audio/assets/audio-pins.png | Bin .../giga-audio/assets/dacs-and-jack.png | Bin .../giga-audio/assets/jack-schematic-1.png | Bin .../giga-audio/assets/jack-schematic-2.png | Bin .../giga-audio/assets/jack-schematic-3.png | Bin .../tutorials/giga-audio/content.md | 1830 ++++++++--------- .../tutorials/giga-audio/hero-banner.png | Bin .../assets/camera-connector-photo.png | Bin .../assets/camera-connector-pins.png | Bin .../assets/camera-connector-zoomed.png | Bin .../giga-camera/assets/camera-schematic.png | Bin .../giga-camera/assets/processing-example.png | Bin .../tutorials/giga-camera/giga-camera.md | 0 .../tutorials/giga-camera/hero-banner.png | Bin .../giga-dual-core/assets/flash-split.png | Bin .../giga-dual-core/assets/target-core.png | Bin .../giga-dual-core/giga-dual-core.md | 0 .../tutorials/giga-dual-core/hero-banner.png | Bin .../assets/giga-connected.png | Bin .../assets/giga-examples.png | Bin .../assets/install-giga-core.png | Bin .../giga-getting-started/assets/open-ide.png | Bin .../giga-getting-started.md | 0 .../giga-getting-started/hero-banner.png | Bin .../assets/giga-main-boot.png | Bin .../giga-micropython/assets/giga-msd.png | Bin .../giga-micropython/giga-micropython.md | 0 .../giga-micropython/hero-banner.png | Bin .../giga-usb/assets/giga-file-write.png | Bin .../giga-usb/assets/giga-keyboard-connect.png | Bin .../giga-usb/assets/usb-connectors.png | Bin .../tutorials/giga-usb/giga-usb.md | 0 .../tutorials/giga-usb/hero-banner.png | Bin .../certifications/Arduino_A000067-DoC_CE.pdf | Bin .../Arduino_A000067-DoC_FCC.pdf | Bin .../Arduino_A000067-DoC_UKCA.pdf | Bin .../boards/mega-2560/compatibility.yml | 0 .../datasheet/assets/ArduinoFeatureImage.png | Bin .../assets/ArduinoMEGAMountHoles.png | Bin .../datasheet/assets/ArduinoMEGAOutline.png | Bin .../datasheet/assets/ArduinoMEGAPinOut.png | Bin .../datasheet/assets/ArduinoMEGAPinOut2.png | Bin .../datasheet/assets/ArduinoMEGATopView.png | Bin .../assets/Block_Diagram_Mega2560.png | Bin .../assets/Power_Tree_Mega_2560_Rev2.svg | 0 .../boards/mega-2560/datasheet/datasheet.md | 0 .../downloads/A000067-full-pinout.pdf | Bin .../mega-2560/downloads/eagle-files.zip | Bin .../boards/mega-2560/downloads/fritzing.fzpz | Bin .../boards/mega-2560/downloads/schematics.pdf | Bin .../boards/mega-2560/essentials.md | 0 .../boards/mega-2560/features.md | 0 .../boards/mega-2560/image.svg | 0 .../interactive/A000067-altium.zip.gpg | Bin .../mega-2560/interactive/A000067-pinout.png | Bin .../boards/mega-2560/product.md | 0 .../boards/mega-2560/suggestions.md | 0 .../boards/mega-2560/tech-specs.md | 0 .../boards/mega-2560/tech-specs.yml | 0 .../hardware/{09.mega => 10.mega}/family.md | 6 +- .../{09.mega => 10.mega}/image-480.png | Bin .../hardware/{09.mega => 10.mega}/image.png | Bin 315 files changed, 2930 insertions(+), 2923 deletions(-) create mode 100644 content/hardware/07.opta/family.md create mode 100644 content/hardware/07.opta/image-480.png create mode 100644 content/hardware/07.opta/image.png create mode 100644 content/hardware/07.opta/opta-family/category.md rename content/hardware/{05.pro-solutions/solutions-and-kits => 07.opta/opta-family}/opta/compatibility.yml (100%) rename content/hardware/{05.pro-solutions/solutions-and-kits => 07.opta/opta-family}/opta/datasheet/assets/featured.png (100%) rename content/hardware/{05.pro-solutions/solutions-and-kits => 07.opta/opta-family}/opta/datasheet/assets/opta_mechanical.svg (100%) rename content/hardware/{05.pro-solutions/solutions-and-kits => 07.opta/opta-family}/opta/datasheet/assets/opta_panel.svg (100%) rename content/hardware/{05.pro-solutions/solutions-and-kits => 07.opta/opta-family}/opta/datasheet/assets/opta_wiring_modbus.svg (100%) rename content/hardware/{05.pro-solutions/solutions-and-kits => 07.opta/opta-family}/opta/datasheet/datasheet.md (98%) rename content/hardware/{05.pro-solutions/solutions-and-kits => 07.opta/opta-family}/opta/features.md (100%) rename content/hardware/{05.pro-solutions/solutions-and-kits => 07.opta/opta-family}/opta/image.svg (100%) rename content/hardware/{05.pro-solutions/solutions-and-kits => 07.opta/opta-family}/opta/product.md (100%) rename content/hardware/{05.pro-solutions/solutions-and-kits => 07.opta/opta-family}/opta/tech-specs.md (100%) rename content/hardware/{05.pro-solutions/solutions-and-kits => 07.opta/opta-family}/opta/tech-specs.yml (100%) rename content/hardware/{05.pro-solutions/solutions-and-kits => 07.opta/opta-family}/opta/tutorials/getting-started-connectivity/assets/opta-ble.svg (100%) rename content/hardware/{05.pro-solutions/solutions-and-kits => 07.opta/opta-family}/opta/tutorials/getting-started-connectivity/assets/opta-ethernet.svg (100%) rename content/hardware/{05.pro-solutions/solutions-and-kits => 07.opta/opta-family}/opta/tutorials/getting-started-connectivity/assets/opta-wifi.svg (100%) rename content/hardware/{05.pro-solutions/solutions-and-kits => 07.opta/opta-family}/opta/tutorials/getting-started-connectivity/content.md (100%) rename content/hardware/{05.pro-solutions/solutions-and-kits => 07.opta/opta-family}/opta/tutorials/getting-started-with-modbus-rtu/assets/Opta_Modbus_RTU_Example.zip (100%) rename content/hardware/{05.pro-solutions/solutions-and-kits => 07.opta/opta-family}/opta/tutorials/getting-started-with-modbus-rtu/assets/opta-modbus-client.svg (100%) rename content/hardware/{05.pro-solutions/solutions-and-kits => 07.opta/opta-family}/opta/tutorials/getting-started-with-modbus-rtu/assets/opta-modbus-connection.svg (100%) rename content/hardware/{05.pro-solutions/solutions-and-kits => 07.opta/opta-family}/opta/tutorials/getting-started-with-modbus-rtu/content.md (97%) rename content/hardware/{05.pro-solutions/solutions-and-kits => 07.opta/opta-family}/opta/tutorials/getting-started-with-rs485/assets/Opta_RS485_Example.zip (100%) rename content/hardware/{05.pro-solutions/solutions-and-kits => 07.opta/opta-family}/opta/tutorials/getting-started-with-rs485/assets/opta-modbus-connection.svg (100%) rename content/hardware/{05.pro-solutions/solutions-and-kits => 07.opta/opta-family}/opta/tutorials/getting-started-with-rs485/content.md (98%) rename content/hardware/{05.pro-solutions/solutions-and-kits => 07.opta/opta-family}/opta/tutorials/getting-started-with-rs485/hero-banner.png (100%) rename content/hardware/{05.pro-solutions/solutions-and-kits => 07.opta/opta-family}/opta/tutorials/getting-started/assets/opta-analog-inputs.svg (100%) rename content/hardware/{05.pro-solutions/solutions-and-kits => 07.opta/opta-family}/opta/tutorials/getting-started/assets/opta-clean-contact.svg (100%) rename content/hardware/{05.pro-solutions/solutions-and-kits => 07.opta/opta-family}/opta/tutorials/getting-started/assets/opta-core-install.png (100%) rename content/hardware/{05.pro-solutions/solutions-and-kits => 07.opta/opta-family}/opta/tutorials/getting-started/assets/opta-device-LED.svg (100%) rename content/hardware/{05.pro-solutions/solutions-and-kits => 07.opta/opta-family}/opta/tutorials/getting-started/assets/opta-device-button.svg (100%) rename content/hardware/{05.pro-solutions/solutions-and-kits => 07.opta/opta-family}/opta/tutorials/getting-started/assets/opta-device.svg (100%) rename content/hardware/{05.pro-solutions/solutions-and-kits => 07.opta/opta-family}/opta/tutorials/getting-started/assets/opta-out-relays.svg (100%) rename content/hardware/{05.pro-solutions/solutions-and-kits => 07.opta/opta-family}/opta/tutorials/getting-started/assets/opta-voltage-pins.svg (100%) rename content/hardware/{05.pro-solutions/solutions-and-kits => 07.opta/opta-family}/opta/tutorials/getting-started/content.md (100%) rename content/hardware/{05.pro-solutions/solutions-and-kits => 07.opta/opta-family}/opta/tutorials/tank-level-app-note/assets/application_representation.svg (100%) rename content/hardware/{05.pro-solutions/solutions-and-kits => 07.opta/opta-family}/opta/tutorials/tank-level-app-note/assets/cloud_integration.svg (100%) rename content/hardware/{05.pro-solutions/solutions-and-kits => 07.opta/opta-family}/opta/tutorials/tank-level-app-note/assets/electrical_connections.svg (100%) rename content/hardware/{05.pro-solutions/solutions-and-kits => 07.opta/opta-family}/opta/tutorials/tank-level-app-note/assets/tank-level-monitoring-sketch.zip (100%) rename content/hardware/{05.pro-solutions/solutions-and-kits => 07.opta/opta-family}/opta/tutorials/tank-level-app-note/content.md (100%) rename content/hardware/{05.pro-solutions/solutions-and-kits => 07.opta/opta-family}/opta/tutorials/tank-level-app-note/hero-banner.png (100%) rename content/hardware/{07.edu => 08.edu}/carriers/braccio-carrier/compatibility.yml (100%) rename content/hardware/{07.edu => 08.edu}/carriers/braccio-carrier/datasheet/assets/Block_Diagram_Braccio_Carrier.svg (100%) rename content/hardware/{07.edu => 08.edu}/carriers/braccio-carrier/datasheet/assets/Power_Tree_Braccio_Carrier.jpg (100%) rename content/hardware/{07.edu => 08.edu}/carriers/braccio-carrier/datasheet/assets/System_Block_Diagram_Braccio_Carrier.jpg (100%) rename content/hardware/{07.edu => 08.edu}/carriers/braccio-carrier/datasheet/assets/braccio-connectors.svg (100%) rename content/hardware/{07.edu => 08.edu}/carriers/braccio-carrier/datasheet/assets/braccio-mount.svg (100%) rename content/hardware/{07.edu => 08.edu}/carriers/braccio-carrier/datasheet/assets/braccio-outline.svg (100%) rename content/hardware/{07.edu => 08.edu}/carriers/braccio-carrier/datasheet/assets/braccio-pinout.png (100%) rename content/hardware/{07.edu => 08.edu}/carriers/braccio-carrier/datasheet/assets/featured.png (100%) rename content/hardware/{07.edu => 08.edu}/carriers/braccio-carrier/datasheet/datasheet.md (100%) rename content/hardware/{07.edu => 08.edu}/carriers/braccio-carrier/downloads/ABX00032-dxf.zip (100%) rename content/hardware/{07.edu => 08.edu}/carriers/braccio-carrier/downloads/ABX00032-fritzing.fzpz (100%) rename content/hardware/{07.edu => 08.edu}/carriers/braccio-carrier/downloads/ABX00032-full-pinout.pdf (100%) rename content/hardware/{07.edu => 08.edu}/carriers/braccio-carrier/downloads/ABX00032-schematics.pdf (100%) rename content/hardware/{07.edu => 08.edu}/carriers/braccio-carrier/downloads/ABX00032-stand-stl.zip (100%) rename content/hardware/{07.edu => 08.edu}/carriers/braccio-carrier/downloads/ABX00032-step.zip (100%) rename content/hardware/{07.edu => 08.edu}/carriers/braccio-carrier/essentials.md (100%) rename content/hardware/{07.edu => 08.edu}/carriers/braccio-carrier/features.md (100%) rename content/hardware/{07.edu => 08.edu}/carriers/braccio-carrier/image.svg (100%) rename content/hardware/{07.edu => 08.edu}/carriers/braccio-carrier/interactive/ABX00032-pinout.png (100%) rename content/hardware/{07.edu => 08.edu}/carriers/braccio-carrier/product.md (100%) rename content/hardware/{07.edu => 08.edu}/carriers/braccio-carrier/tech-specs.md (100%) rename content/hardware/{07.edu => 08.edu}/carriers/braccio-carrier/tech-specs.yml (100%) rename content/hardware/{07.edu => 08.edu}/carriers/category.md (100%) rename content/hardware/{07.edu => 08.edu}/family.md (100%) rename content/hardware/{07.edu => 08.edu}/image-480.png (100%) rename content/hardware/{07.edu => 08.edu}/image.png (100%) rename content/hardware/{08.kits => 09.kits}/family.md (100%) rename content/hardware/{08.kits => 09.kits}/image-480.png (100%) rename content/hardware/{08.kits => 09.kits}/image.png (100%) rename content/hardware/{08.kits => 09.kits}/maker/category.md (100%) rename content/hardware/{08.kits/maker/plant-watering-kit => 09.kits/maker/iot-bundle}/compatibility.yml (100%) rename content/hardware/{08.kits => 09.kits}/maker/iot-bundle/features.md (96%) rename content/hardware/{08.kits => 09.kits}/maker/iot-bundle/image.svg (100%) rename content/hardware/{08.kits => 09.kits}/maker/iot-bundle/product.md (98%) rename content/hardware/{08.kits => 09.kits}/maker/iot-bundle/tech-specs.md (100%) rename content/hardware/{08.kits => 09.kits}/maker/iot-bundle/tech-specs.yml (96%) rename content/hardware/{08.kits => 09.kits}/maker/iot-bundle/tutorials/i-love-you-pillow/assets/_ypE8fl7Ln6.png (100%) rename content/hardware/{08.kits => 09.kits}/maker/iot-bundle/tutorials/i-love-you-pillow/assets/circuit_tLcnUy2ifl.png (100%) rename content/hardware/{08.kits => 09.kits}/maker/iot-bundle/tutorials/i-love-you-pillow/assets/love-you-pillow-01_VoyWPl8L6l.gif (100%) rename content/hardware/{08.kits => 09.kits}/maker/iot-bundle/tutorials/i-love-you-pillow/assets/love-you-pillow-02_ydUsouV4bl.gif (100%) rename content/hardware/{08.kits => 09.kits}/maker/iot-bundle/tutorials/i-love-you-pillow/assets/pillow2-cover_eWFrQi0MOT.png (100%) rename content/hardware/{08.kits => 09.kits}/maker/iot-bundle/tutorials/i-love-you-pillow/assets/screenshot_2022-03-30_at_14_26_54_stYUq5y7c2.png (100%) rename content/hardware/{08.kits => 09.kits}/maker/iot-bundle/tutorials/i-love-you-pillow/assets/screenshot_2022-11-23_140745_adGbm9cDej.png (100%) rename content/hardware/{08.kits => 09.kits}/maker/iot-bundle/tutorials/i-love-you-pillow/assets/template_overview.png (100%) rename content/hardware/{08.kits => 09.kits}/maker/iot-bundle/tutorials/i-love-you-pillow/content.md (100%) rename content/hardware/{08.kits => 09.kits}/maker/iot-bundle/tutorials/i-love-you-pillow/hero-banner.png (100%) rename content/hardware/{08.kits => 09.kits}/maker/iot-bundle/tutorials/pavlovs-cat/assets/_mV3ZK8zeAh.png (100%) rename content/hardware/{08.kits => 09.kits}/maker/iot-bundle/tutorials/pavlovs-cat/assets/gif-cat_vCx1OHLrzl.gif (100%) rename content/hardware/{08.kits => 09.kits}/maker/iot-bundle/tutorials/pavlovs-cat/assets/light_rp2040_w373rVgQAw.png (100%) rename content/hardware/{08.kits => 09.kits}/maker/iot-bundle/tutorials/pavlovs-cat/assets/palvov-cat-01_FHBOz5Z3MA.gif (100%) rename content/hardware/{08.kits => 09.kits}/maker/iot-bundle/tutorials/pavlovs-cat/assets/palvov-cat-02.gif (100%) rename content/hardware/{08.kits => 09.kits}/maker/iot-bundle/tutorials/pavlovs-cat/assets/palvov-cat-03_EJSoVjN9qB.gif (100%) rename content/hardware/{08.kits => 09.kits}/maker/iot-bundle/tutorials/pavlovs-cat/assets/piezo_buzzer_rp2040_whR92Z3Wgx.png (100%) rename content/hardware/{08.kits => 09.kits}/maker/iot-bundle/tutorials/pavlovs-cat/assets/screenshot_2022-11-23_141459_JVW8zmmeP0.png (100%) rename content/hardware/{08.kits => 09.kits}/maker/iot-bundle/tutorials/pavlovs-cat/assets/servo_motor_rp2040_PAcv0Yejb2.png (100%) rename content/hardware/{08.kits => 09.kits}/maker/iot-bundle/tutorials/pavlovs-cat/assets/template_overview.png (100%) rename content/hardware/{08.kits => 09.kits}/maker/iot-bundle/tutorials/pavlovs-cat/content.md (100%) rename content/hardware/{08.kits => 09.kits}/maker/iot-bundle/tutorials/pavlovs-cat/hero-banner.png (100%) rename content/hardware/{08.kits => 09.kits}/maker/iot-bundle/tutorials/plant-communicator/assets/_rdaslUwR6h.png (100%) rename content/hardware/{08.kits => 09.kits}/maker/iot-bundle/tutorials/plant-communicator/assets/diy-soil-moisture-rp2040_q2RlMGdgl9.png (100%) rename content/hardware/{08.kits => 09.kits}/maker/iot-bundle/tutorials/plant-communicator/assets/light__temperature_sensor_rp2040_bfbwQp7XjU.png (100%) rename content/hardware/{08.kits => 09.kits}/maker/iot-bundle/tutorials/plant-communicator/assets/plant_communicator_01.gif (100%) rename content/hardware/{08.kits => 09.kits}/maker/iot-bundle/tutorials/plant-communicator/assets/plant_communicator_03__2_.gif (100%) rename content/hardware/{08.kits => 09.kits}/maker/iot-bundle/tutorials/plant-communicator/assets/plant_communicator_04.gif (100%) rename content/hardware/{08.kits => 09.kits}/maker/iot-bundle/tutorials/plant-communicator/assets/screenshot_2022-11-23_141037_Q9gBcgrkER.png (100%) rename content/hardware/{08.kits => 09.kits}/maker/iot-bundle/tutorials/plant-communicator/assets/template_overview.png (100%) rename content/hardware/{08.kits => 09.kits}/maker/iot-bundle/tutorials/plant-communicator/content.md (100%) rename content/hardware/{08.kits => 09.kits}/maker/iot-bundle/tutorials/plant-communicator/hero-banner.png (100%) rename content/hardware/{08.kits => 09.kits}/maker/iot-bundle/tutorials/puzzlebox/assets/_VbBUKNXj0o.png (100%) rename content/hardware/{08.kits => 09.kits}/maker/iot-bundle/tutorials/puzzlebox/assets/cloudinstructions_rp2040_0AMlQHeGHs.gif (100%) rename content/hardware/{08.kits => 09.kits}/maker/iot-bundle/tutorials/puzzlebox/assets/lcd_part_rp2040_wOrq2EKGuO.png (100%) rename content/hardware/{08.kits => 09.kits}/maker/iot-bundle/tutorials/puzzlebox/assets/piezo_buzzer_comeplete_rp2040_JAUtOjyKq1.png (100%) rename content/hardware/{08.kits => 09.kits}/maker/iot-bundle/tutorials/puzzlebox/assets/piezo_buzzer_part_rp2040_iaPHtGSH0X.png (100%) rename content/hardware/{08.kits => 09.kits}/maker/iot-bundle/tutorials/puzzlebox/assets/potentiometer_part_rp2040_q8hHfs8AIS.png (100%) rename content/hardware/{08.kits => 09.kits}/maker/iot-bundle/tutorials/puzzlebox/assets/puzzlebox_pi0UiMBngP.gif (100%) rename content/hardware/{08.kits => 09.kits}/maker/iot-bundle/tutorials/puzzlebox/assets/rgb_comeplete_rp2040_6AuNMnXduR.png (100%) rename content/hardware/{08.kits => 09.kits}/maker/iot-bundle/tutorials/puzzlebox/assets/rgb_part_rp2040_4eGOKtRQgk.png (100%) rename content/hardware/{08.kits => 09.kits}/maker/iot-bundle/tutorials/puzzlebox/assets/rgbled_s82wjxgcnf_1WXt8cDpSj.png (100%) rename content/hardware/{08.kits => 09.kits}/maker/iot-bundle/tutorials/puzzlebox/assets/safe_combination_Xkek4QBhoy.gif (100%) rename content/hardware/{08.kits => 09.kits}/maker/iot-bundle/tutorials/puzzlebox/assets/screenshot_2022-11-17_095328_ujTWxb7Xtp.png (100%) rename content/hardware/{08.kits => 09.kits}/maker/iot-bundle/tutorials/puzzlebox/assets/screenshot_2022-11-23_141306_tsMoI77zJw.png (100%) rename content/hardware/{08.kits => 09.kits}/maker/iot-bundle/tutorials/puzzlebox/assets/servo_motor_comeplete_rp2040_mXHekbPnRO.png (100%) rename content/hardware/{08.kits => 09.kits}/maker/iot-bundle/tutorials/puzzlebox/assets/servo_motor_part_rp2040_4ZqZ4C9F5w.png (100%) rename content/hardware/{08.kits => 09.kits}/maker/iot-bundle/tutorials/puzzlebox/assets/template_overview.png (100%) rename content/hardware/{08.kits => 09.kits}/maker/iot-bundle/tutorials/puzzlebox/content.md (100%) rename content/hardware/{08.kits => 09.kits}/maker/iot-bundle/tutorials/puzzlebox/hero-banner.png (100%) rename content/hardware/{08.kits => 09.kits}/maker/iot-bundle/tutorials/the-nerd/assets/_45dZFAyOab.png (100%) rename content/hardware/{08.kits => 09.kits}/maker/iot-bundle/tutorials/the-nerd/assets/nerd-cloud-setup_RC5c4S0ASc.gif (100%) rename content/hardware/{08.kits => 09.kits}/maker/iot-bundle/tutorials/the-nerd/assets/screenshot_2022-11-18_175524_4XRWc1dHYc.png (100%) rename content/hardware/{08.kits => 09.kits}/maker/iot-bundle/tutorials/the-nerd/assets/template_overview.png (100%) rename content/hardware/{08.kits => 09.kits}/maker/iot-bundle/tutorials/the-nerd/assets/the_nerd_m3DggOdFBj.gif (100%) rename content/hardware/{08.kits => 09.kits}/maker/iot-bundle/tutorials/the-nerd/assets/the_nerd_rp2040_dqr7egmpao_ESpsLy8iaq.png (100%) rename content/hardware/{08.kits => 09.kits}/maker/iot-bundle/tutorials/the-nerd/content.md (100%) rename content/hardware/{08.kits => 09.kits}/maker/iot-bundle/tutorials/the-nerd/hero-banner.png (100%) rename content/hardware/{08.kits => 09.kits}/maker/make-your-uno-kit/certifications/Arduino_AKX00037-DoC_CE.pdf (100%) rename content/hardware/{08.kits => 09.kits}/maker/make-your-uno-kit/compatibility.yml (94%) rename content/hardware/{08.kits => 09.kits}/maker/make-your-uno-kit/datasheet/assets/audioComponentsView.png (100%) rename content/hardware/{08.kits => 09.kits}/maker/make-your-uno-kit/datasheet/assets/boardOutline.svg (100%) rename content/hardware/{08.kits => 09.kits}/maker/make-your-uno-kit/datasheet/assets/featured.png (100%) rename content/hardware/{08.kits => 09.kits}/maker/make-your-uno-kit/datasheet/assets/fusionOutline.svg (100%) rename content/hardware/{08.kits => 09.kits}/maker/make-your-uno-kit/datasheet/assets/lowAudioSynth.png (100%) rename content/hardware/{08.kits => 09.kits}/maker/make-your-uno-kit/datasheet/assets/pinout.png (100%) rename content/hardware/{08.kits => 09.kits}/maker/make-your-uno-kit/datasheet/assets/powerTree.svg (100%) rename content/hardware/{08.kits => 09.kits}/maker/make-your-uno-kit/datasheet/assets/synthMounted.png (100%) rename content/hardware/{08.kits => 09.kits}/maker/make-your-uno-kit/datasheet/assets/synthOutline.svg (100%) rename content/hardware/{08.kits => 09.kits}/maker/make-your-uno-kit/datasheet/assets/synthPotentiometers.svg (100%) rename content/hardware/{08.kits => 09.kits}/maker/make-your-uno-kit/datasheet/assets/synthTopology.svg (100%) rename content/hardware/{08.kits => 09.kits}/maker/make-your-uno-kit/datasheet/assets/unoComponentsView.png (100%) rename content/hardware/{08.kits => 09.kits}/maker/make-your-uno-kit/datasheet/assets/unoOverview.png (100%) rename content/hardware/{08.kits => 09.kits}/maker/make-your-uno-kit/datasheet/datasheet.md (100%) rename content/hardware/{08.kits => 09.kits}/maker/make-your-uno-kit/downloads/AKX00037-cad-files.zip (100%) rename content/hardware/{08.kits => 09.kits}/maker/make-your-uno-kit/downloads/AKX00037-schematics.pdf (100%) rename content/hardware/{08.kits => 09.kits}/maker/make-your-uno-kit/downloads/ASX00037-full-pinout.pdf (100%) rename content/hardware/{08.kits => 09.kits}/maker/make-your-uno-kit/features.md (96%) rename content/hardware/{08.kits => 09.kits}/maker/make-your-uno-kit/image.svg (100%) rename content/hardware/{08.kits => 09.kits}/maker/make-your-uno-kit/interactive/ASX00037-pinout.png (100%) rename content/hardware/{08.kits => 09.kits}/maker/make-your-uno-kit/interactive/altium.zip (100%) rename content/hardware/{08.kits => 09.kits}/maker/make-your-uno-kit/product.md (98%) rename content/hardware/{08.kits => 09.kits}/maker/make-your-uno-kit/tech-specs.md (100%) rename content/hardware/{08.kits => 09.kits}/maker/make-your-uno-kit/tech-specs.yml (94%) rename content/hardware/{08.kits/maker/iot-bundle => 09.kits/maker/plant-watering-kit}/compatibility.yml (93%) rename content/hardware/{08.kits => 09.kits}/maker/plant-watering-kit/features.md (100%) rename content/hardware/{08.kits => 09.kits}/maker/plant-watering-kit/image.svg (100%) rename content/hardware/{08.kits => 09.kits}/maker/plant-watering-kit/product.md (100%) rename content/hardware/{08.kits => 09.kits}/maker/plant-watering-kit/tech-specs.md (100%) rename content/hardware/{08.kits => 09.kits}/maker/plant-watering-kit/tech-specs.yml (100%) rename content/hardware/{08.kits => 09.kits}/maker/plant-watering-kit/tutorials/iot-smart-garden-setup-with-nanorp2040/assets/cabletwisting.gif (100%) rename content/hardware/{08.kits => 09.kits}/maker/plant-watering-kit/tutorials/iot-smart-garden-setup-with-nanorp2040/assets/completesetup.jpg (100%) rename content/hardware/{08.kits => 09.kits}/maker/plant-watering-kit/tutorials/iot-smart-garden-setup-with-nanorp2040/assets/coverpage.png (100%) rename content/hardware/{08.kits => 09.kits}/maker/plant-watering-kit/tutorials/iot-smart-garden-setup-with-nanorp2040/assets/dashboard-overview.png (100%) rename content/hardware/{08.kits => 09.kits}/maker/plant-watering-kit/tutorials/iot-smart-garden-setup-with-nanorp2040/assets/dashboard_initial.png (100%) rename content/hardware/{08.kits => 09.kits}/maker/plant-watering-kit/tutorials/iot-smart-garden-setup-with-nanorp2040/assets/step1.png (100%) rename content/hardware/{08.kits => 09.kits}/maker/plant-watering-kit/tutorials/iot-smart-garden-setup-with-nanorp2040/assets/step2.png (100%) rename content/hardware/{08.kits => 09.kits}/maker/plant-watering-kit/tutorials/iot-smart-garden-setup-with-nanorp2040/assets/step3.png (100%) rename content/hardware/{08.kits => 09.kits}/maker/plant-watering-kit/tutorials/iot-smart-garden-setup-with-nanorp2040/assets/step4.png (100%) rename content/hardware/{08.kits => 09.kits}/maker/plant-watering-kit/tutorials/iot-smart-garden-setup-with-nanorp2040/assets/step5.png (100%) rename content/hardware/{08.kits => 09.kits}/maker/plant-watering-kit/tutorials/iot-smart-garden-setup-with-nanorp2040/assets/step6.png (100%) rename content/hardware/{08.kits => 09.kits}/maker/plant-watering-kit/tutorials/iot-smart-garden-setup-with-nanorp2040/assets/step7.png (100%) rename content/hardware/{08.kits => 09.kits}/maker/plant-watering-kit/tutorials/iot-smart-garden-setup-with-nanorp2040/assets/template_overview.png (100%) rename content/hardware/{08.kits => 09.kits}/maker/plant-watering-kit/tutorials/iot-smart-garden-setup-with-nanorp2040/assets/things.png (100%) rename content/hardware/{08.kits => 09.kits}/maker/plant-watering-kit/tutorials/iot-smart-garden-setup-with-nanorp2040/assets/ziptie.gif (100%) rename content/hardware/{08.kits => 09.kits}/maker/plant-watering-kit/tutorials/iot-smart-garden-setup-with-nanorp2040/content.md (100%) rename content/hardware/{08.kits => 09.kits}/maker/plant-watering-kit/tutorials/iot-smart-garden-setup-with-nanorp2040/hero-banner.png (100%) rename content/hardware/{09.mega => 10.mega}/boards/category.md (100%) rename content/hardware/{09.mega => 10.mega}/boards/due/certifications/Arduino_A000056-DoC_CE_without headers.pdf (100%) rename content/hardware/{09.mega => 10.mega}/boards/due/certifications/Arduino_A000062-DoC_CE.pdf (100%) rename content/hardware/{09.mega => 10.mega}/boards/due/certifications/Arduino_A000062-DoC_UKCA.pdf (100%) rename content/hardware/{09.mega => 10.mega}/boards/due/compatibility.yml (100%) rename content/hardware/{09.mega => 10.mega}/boards/due/downloads/A000056-full-pinout.pdf (100%) rename content/hardware/{09.mega => 10.mega}/boards/due/downloads/eagle-files.zip (100%) rename content/hardware/{09.mega => 10.mega}/boards/due/downloads/fritzing.fzpz (100%) rename content/hardware/{09.mega => 10.mega}/boards/due/downloads/schematics.pdf (100%) rename content/hardware/{09.mega => 10.mega}/boards/due/essentials.md (100%) rename content/hardware/{09.mega => 10.mega}/boards/due/features.md (100%) rename content/hardware/{09.mega => 10.mega}/boards/due/image.svg (100%) rename content/hardware/{09.mega => 10.mega}/boards/due/interactive/A000056-pinout.png (100%) rename content/hardware/{09.mega => 10.mega}/boards/due/interactive/A000062-altium.zip.gpg (100%) rename content/hardware/{09.mega => 10.mega}/boards/due/product.md (100%) rename content/hardware/{09.mega => 10.mega}/boards/due/suggestions.md (100%) rename content/hardware/{09.mega => 10.mega}/boards/due/tech-specs.md (100%) rename content/hardware/{09.mega => 10.mega}/boards/due/tech-specs.yml (100%) rename content/hardware/{09.mega => 10.mega}/boards/due/tutorials/due-extended-spi/due-extended-spi.md (100%) rename content/hardware/{09.mega => 10.mega}/boards/due/tutorials/due-motor-shield-dc/assets/DueMotorShieldFan.jpg (100%) rename content/hardware/{09.mega => 10.mega}/boards/due/tutorials/due-motor-shield-dc/due-motor-shield-dc.md (100%) rename content/hardware/{09.mega => 10.mega}/boards/due/tutorials/keyboard-controller/keyboard-controller.md (100%) rename content/hardware/{09.mega => 10.mega}/boards/due/tutorials/mouse-controller/assets/DueUSBPorts.png (100%) rename content/hardware/{09.mega => 10.mega}/boards/due/tutorials/mouse-controller/mouse-controller.md (100%) rename content/hardware/{09.mega => 10.mega}/boards/due/tutorials/multiple-blinks/content.md (100%) rename content/hardware/{09.mega => 10.mega}/boards/due/tutorials/simple-waveform-generator/assets/DueSimpleWaveform_fritzing.png (100%) rename content/hardware/{09.mega => 10.mega}/boards/due/tutorials/simple-waveform-generator/assets/Duewaveforms.jpg (100%) rename content/hardware/{09.mega => 10.mega}/boards/due/tutorials/simple-waveform-generator/keyboard-controller/assets/DueUSBPorts.png (100%) rename content/hardware/{09.mega => 10.mega}/boards/due/tutorials/simple-waveform-generator/keyboard-controller/keyboard-controller.md (100%) rename content/hardware/{09.mega => 10.mega}/boards/due/tutorials/simple-waveform-generator/simple-waveform-generator.md (97%) rename content/hardware/{09.mega => 10.mega}/boards/due/tutorials/upgrading-16u2-due/assets/Due16U2UpgradeSPI.jpg (100%) rename content/hardware/{09.mega => 10.mega}/boards/due/tutorials/upgrading-16u2-due/upgrading-16u2-due.md (97%) rename content/hardware/{09.mega => 10.mega}/boards/giga-r1-wifi/compatibility.yml (100%) rename content/hardware/{09.mega => 10.mega}/boards/giga-r1-wifi/datasheet/assets/GIGA_R1_WiFi_Block_Diagram.png (100%) rename content/hardware/{09.mega => 10.mega}/boards/giga-r1-wifi/datasheet/assets/GIGA_R1_WiFi_Power_Tree.png (100%) rename content/hardware/{09.mega => 10.mega}/boards/giga-r1-wifi/datasheet/assets/featured.png (100%) rename content/hardware/{09.mega => 10.mega}/boards/giga-r1-wifi/datasheet/assets/gigaMechanical.png (100%) rename content/hardware/{09.mega => 10.mega}/boards/giga-r1-wifi/datasheet/assets/gigaR1WiFiBottom.png (100%) rename content/hardware/{09.mega => 10.mega}/boards/giga-r1-wifi/datasheet/assets/gigaR1WiFiTop.png (100%) rename content/hardware/{09.mega => 10.mega}/boards/giga-r1-wifi/datasheet/datasheet.md (100%) rename content/hardware/{09.mega => 10.mega}/boards/giga-r1-wifi/downloads/ABX00063-cad-files.zip (100%) rename content/hardware/{09.mega => 10.mega}/boards/giga-r1-wifi/downloads/ABX00063-full-pinout.pdf (100%) rename content/hardware/{09.mega => 10.mega}/boards/giga-r1-wifi/downloads/ABX00063-pinout.png (100%) rename content/hardware/{09.mega => 10.mega}/boards/giga-r1-wifi/downloads/ABX00063-schematics.pdf (100%) rename content/hardware/{09.mega => 10.mega}/boards/giga-r1-wifi/essentials.md (100%) rename content/hardware/{09.mega => 10.mega}/boards/giga-r1-wifi/features.md (100%) rename content/hardware/{09.mega => 10.mega}/boards/giga-r1-wifi/image.svg (100%) rename content/hardware/{09.mega => 10.mega}/boards/giga-r1-wifi/interactive/ABX00063-pinout.png (100%) rename content/hardware/{09.mega => 10.mega}/boards/giga-r1-wifi/interactive/altium.zip (100%) rename content/hardware/{09.mega => 10.mega}/boards/giga-r1-wifi/product.md (100%) rename content/hardware/{09.mega => 10.mega}/boards/giga-r1-wifi/tech-specs.md (100%) rename content/hardware/{09.mega => 10.mega}/boards/giga-r1-wifi/tech-specs.yml (100%) rename content/hardware/{09.mega => 10.mega}/boards/giga-r1-wifi/tutorials/cheat-sheet/assets/BOOT0.png (100%) rename content/hardware/{09.mega => 10.mega}/boards/giga-r1-wifi/tutorials/cheat-sheet/assets/STM32H747XI.png (100%) rename content/hardware/{09.mega => 10.mega}/boards/giga-r1-wifi/tutorials/cheat-sheet/assets/audio-jack.png (100%) rename content/hardware/{09.mega => 10.mega}/boards/giga-r1-wifi/tutorials/cheat-sheet/assets/canpins.png (100%) rename content/hardware/{09.mega => 10.mega}/boards/giga-r1-wifi/tutorials/cheat-sheet/assets/i2cpins.png (100%) rename content/hardware/{09.mega => 10.mega}/boards/giga-r1-wifi/tutorials/cheat-sheet/assets/jtag.png (100%) rename content/hardware/{09.mega => 10.mega}/boards/giga-r1-wifi/tutorials/cheat-sheet/assets/red_led_blink.gif (100%) rename content/hardware/{09.mega => 10.mega}/boards/giga-r1-wifi/tutorials/cheat-sheet/assets/rtc.png (100%) rename content/hardware/{09.mega => 10.mega}/boards/giga-r1-wifi/tutorials/cheat-sheet/assets/schematics-spi.png (100%) rename content/hardware/{09.mega => 10.mega}/boards/giga-r1-wifi/tutorials/cheat-sheet/assets/spipins.png (100%) rename content/hardware/{09.mega => 10.mega}/boards/giga-r1-wifi/tutorials/cheat-sheet/assets/usb.png (100%) rename content/hardware/{09.mega => 10.mega}/boards/giga-r1-wifi/tutorials/cheat-sheet/assets/wifi.png (100%) rename content/hardware/{09.mega => 10.mega}/boards/giga-r1-wifi/tutorials/cheat-sheet/cheat-sheet.md (100%) rename content/hardware/{09.mega => 10.mega}/boards/giga-r1-wifi/tutorials/cheat-sheet/hero-banner.png (100%) rename content/hardware/{09.mega => 10.mega}/boards/giga-r1-wifi/tutorials/giga-audio/assets/adcs.png (100%) rename content/hardware/{09.mega => 10.mega}/boards/giga-r1-wifi/tutorials/giga-audio/assets/audio-pins.png (100%) rename content/hardware/{09.mega => 10.mega}/boards/giga-r1-wifi/tutorials/giga-audio/assets/dacs-and-jack.png (100%) rename content/hardware/{09.mega => 10.mega}/boards/giga-r1-wifi/tutorials/giga-audio/assets/jack-schematic-1.png (100%) rename content/hardware/{09.mega => 10.mega}/boards/giga-r1-wifi/tutorials/giga-audio/assets/jack-schematic-2.png (100%) rename content/hardware/{09.mega => 10.mega}/boards/giga-r1-wifi/tutorials/giga-audio/assets/jack-schematic-3.png (100%) rename content/hardware/{09.mega => 10.mega}/boards/giga-r1-wifi/tutorials/giga-audio/content.md (97%) rename content/hardware/{09.mega => 10.mega}/boards/giga-r1-wifi/tutorials/giga-audio/hero-banner.png (100%) rename content/hardware/{09.mega => 10.mega}/boards/giga-r1-wifi/tutorials/giga-camera/assets/camera-connector-photo.png (100%) rename content/hardware/{09.mega => 10.mega}/boards/giga-r1-wifi/tutorials/giga-camera/assets/camera-connector-pins.png (100%) rename content/hardware/{09.mega => 10.mega}/boards/giga-r1-wifi/tutorials/giga-camera/assets/camera-connector-zoomed.png (100%) rename content/hardware/{09.mega => 10.mega}/boards/giga-r1-wifi/tutorials/giga-camera/assets/camera-schematic.png (100%) rename content/hardware/{09.mega => 10.mega}/boards/giga-r1-wifi/tutorials/giga-camera/assets/processing-example.png (100%) rename content/hardware/{09.mega => 10.mega}/boards/giga-r1-wifi/tutorials/giga-camera/giga-camera.md (100%) rename content/hardware/{09.mega => 10.mega}/boards/giga-r1-wifi/tutorials/giga-camera/hero-banner.png (100%) rename content/hardware/{09.mega => 10.mega}/boards/giga-r1-wifi/tutorials/giga-dual-core/assets/flash-split.png (100%) rename content/hardware/{09.mega => 10.mega}/boards/giga-r1-wifi/tutorials/giga-dual-core/assets/target-core.png (100%) rename content/hardware/{09.mega => 10.mega}/boards/giga-r1-wifi/tutorials/giga-dual-core/giga-dual-core.md (100%) rename content/hardware/{09.mega => 10.mega}/boards/giga-r1-wifi/tutorials/giga-dual-core/hero-banner.png (100%) rename content/hardware/{09.mega => 10.mega}/boards/giga-r1-wifi/tutorials/giga-getting-started/assets/giga-connected.png (100%) rename content/hardware/{09.mega => 10.mega}/boards/giga-r1-wifi/tutorials/giga-getting-started/assets/giga-examples.png (100%) rename content/hardware/{09.mega => 10.mega}/boards/giga-r1-wifi/tutorials/giga-getting-started/assets/install-giga-core.png (100%) rename content/hardware/{09.mega => 10.mega}/boards/giga-r1-wifi/tutorials/giga-getting-started/assets/open-ide.png (100%) rename content/hardware/{09.mega => 10.mega}/boards/giga-r1-wifi/tutorials/giga-getting-started/giga-getting-started.md (100%) rename content/hardware/{09.mega => 10.mega}/boards/giga-r1-wifi/tutorials/giga-getting-started/hero-banner.png (100%) rename content/hardware/{09.mega => 10.mega}/boards/giga-r1-wifi/tutorials/giga-micropython/assets/giga-main-boot.png (100%) rename content/hardware/{09.mega => 10.mega}/boards/giga-r1-wifi/tutorials/giga-micropython/assets/giga-msd.png (100%) rename content/hardware/{09.mega => 10.mega}/boards/giga-r1-wifi/tutorials/giga-micropython/giga-micropython.md (100%) rename content/hardware/{09.mega => 10.mega}/boards/giga-r1-wifi/tutorials/giga-micropython/hero-banner.png (100%) rename content/hardware/{09.mega => 10.mega}/boards/giga-r1-wifi/tutorials/giga-usb/assets/giga-file-write.png (100%) rename content/hardware/{09.mega => 10.mega}/boards/giga-r1-wifi/tutorials/giga-usb/assets/giga-keyboard-connect.png (100%) rename content/hardware/{09.mega => 10.mega}/boards/giga-r1-wifi/tutorials/giga-usb/assets/usb-connectors.png (100%) rename content/hardware/{09.mega => 10.mega}/boards/giga-r1-wifi/tutorials/giga-usb/giga-usb.md (100%) rename content/hardware/{09.mega => 10.mega}/boards/giga-r1-wifi/tutorials/giga-usb/hero-banner.png (100%) rename content/hardware/{09.mega => 10.mega}/boards/mega-2560/certifications/Arduino_A000067-DoC_CE.pdf (100%) rename content/hardware/{09.mega => 10.mega}/boards/mega-2560/certifications/Arduino_A000067-DoC_FCC.pdf (100%) rename content/hardware/{09.mega => 10.mega}/boards/mega-2560/certifications/Arduino_A000067-DoC_UKCA.pdf (100%) rename content/hardware/{09.mega => 10.mega}/boards/mega-2560/compatibility.yml (100%) rename content/hardware/{09.mega => 10.mega}/boards/mega-2560/datasheet/assets/ArduinoFeatureImage.png (100%) rename content/hardware/{09.mega => 10.mega}/boards/mega-2560/datasheet/assets/ArduinoMEGAMountHoles.png (100%) rename content/hardware/{09.mega => 10.mega}/boards/mega-2560/datasheet/assets/ArduinoMEGAOutline.png (100%) rename content/hardware/{09.mega => 10.mega}/boards/mega-2560/datasheet/assets/ArduinoMEGAPinOut.png (100%) rename content/hardware/{09.mega => 10.mega}/boards/mega-2560/datasheet/assets/ArduinoMEGAPinOut2.png (100%) rename content/hardware/{09.mega => 10.mega}/boards/mega-2560/datasheet/assets/ArduinoMEGATopView.png (100%) rename content/hardware/{09.mega => 10.mega}/boards/mega-2560/datasheet/assets/Block_Diagram_Mega2560.png (100%) rename content/hardware/{09.mega => 10.mega}/boards/mega-2560/datasheet/assets/Power_Tree_Mega_2560_Rev2.svg (100%) rename content/hardware/{09.mega => 10.mega}/boards/mega-2560/datasheet/datasheet.md (100%) rename content/hardware/{09.mega => 10.mega}/boards/mega-2560/downloads/A000067-full-pinout.pdf (100%) rename content/hardware/{09.mega => 10.mega}/boards/mega-2560/downloads/eagle-files.zip (100%) rename content/hardware/{09.mega => 10.mega}/boards/mega-2560/downloads/fritzing.fzpz (100%) rename content/hardware/{09.mega => 10.mega}/boards/mega-2560/downloads/schematics.pdf (100%) rename content/hardware/{09.mega => 10.mega}/boards/mega-2560/essentials.md (100%) rename content/hardware/{09.mega => 10.mega}/boards/mega-2560/features.md (100%) rename content/hardware/{09.mega => 10.mega}/boards/mega-2560/image.svg (100%) rename content/hardware/{09.mega => 10.mega}/boards/mega-2560/interactive/A000067-altium.zip.gpg (100%) rename content/hardware/{09.mega => 10.mega}/boards/mega-2560/interactive/A000067-pinout.png (100%) rename content/hardware/{09.mega => 10.mega}/boards/mega-2560/product.md (100%) rename content/hardware/{09.mega => 10.mega}/boards/mega-2560/suggestions.md (100%) rename content/hardware/{09.mega => 10.mega}/boards/mega-2560/tech-specs.md (100%) rename content/hardware/{09.mega => 10.mega}/boards/mega-2560/tech-specs.yml (100%) rename content/hardware/{09.mega => 10.mega}/family.md (96%) rename content/hardware/{09.mega => 10.mega}/image-480.png (100%) rename content/hardware/{09.mega => 10.mega}/image.png (100%) diff --git a/content/hardware/07.opta/family.md b/content/hardware/07.opta/family.md new file mode 100644 index 0000000000..4e26248386 --- /dev/null +++ b/content/hardware/07.opta/family.md @@ -0,0 +1,4 @@ +--- +title: Opta +description: A secure, easy-to-use micro PLC with Industrial IoT capabilities. +--- \ No newline at end of file diff --git a/content/hardware/07.opta/image-480.png b/content/hardware/07.opta/image-480.png new file mode 100644 index 0000000000000000000000000000000000000000..d18268f8e54388bd699e796de013ec9b1bfcf504 GIT binary patch literal 61905 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 u8`b*T<`HyS^hXuCJH5QptA2 zo^d)bhNIw5>5SRct`9XN2pkCkQJ#p6hm!JF0*mphHTwiFvuSyBi1{C7U>zMna7Hchb!--rK zYYTQB>&A-!$Qhs0JwL0~R!zQtSeyt1r=*7ub>5GhxHxVX}_4_7=h4Lq!;Q@LaY$UZ84o3Ej|1jLOs=Pj=RQ6k zG@8Sz%%^)qsD#O~<$Ez?`MaViLb*JyOZyvttms-b?qDr>-L;I>Y5o&uEZfQo*YEEJ zr;%R1TmzoE6aF9%8{1@2BqTrS1a$KLM|{@*+ELNzpi1*V{;2(l9{@`&7JaQ|Oj+FP zjY>3cu?i*)=KyKK>2M9TQ`Z9Uy@vZ4o+_9)X{|3kS{@GZK?ir=TTu0EU&Ga{_?fgD zRh)n}(7?Uo7N3o%teeyRVWz2xAIZGYKvXx_xmuP0S|e26s?N#G{646`&SJl1VGJ{> z4ylM>ap)Q8zg##wI|~AN^OP=(!{@(a`{I3SYHDHl9IMHfWkAgcK$FdJPHQHRlCbN$rF>5D^wGdO3#UL^%L1AH?(-3S-IW@K5Ho3O4 z0sV=|X;)1K@e(TfVwPAXB?192sb)m_XTBNVL7pD>yOSL3(l5q1J#Bw~ZTolfr1M2tIiMv?Kpzsm z9m;^kU4sGQ0pL)$bdKiJ)&}~YG%C$5Xo$S7W#Qo9<>ll)S~ws-+)|y+?Uk_pYC~*q z@1Ulq0o{O%ZUd@bx2C@K568zgac6@)oDyJt=;sF#aVWNTS2)K~r@dHYZCKpc6p(Tl zt?uFAQE|i#3=}K+6Qn4e4sH_$lQ`J$H>#jS7KtegS+v+#mYD2MiQyahLSzUc;LszgJ~Z1=G{NgdzFzN!D_S6ti|FuH?Qxp}2Oc6S4s znXvQY^LWO&Y<-;0pa$1Ed(P)JW);q9Fw zl>g(y%vucuG9SogfB0K=xp})OJTVauigftE-X&>?X3H~~PgQ|=pL&MUZpn@>`Rjud zswOTbrm&Jy>^Vg(9Izf``7c=07&KRuCI4>kfy#HeH8;&`Y~Nkqc}DHD>uX)y>wj7? z98o6Uh^gcKP8lRPIM~t&x1dW95Zho-t*wuY;s8A6aW*)8f4z=obq1=zy6vUAzoSiJ zp`ZMF4chf;)``(azS@-AZNB_Pch{`6jRRn&w2~w1%toj=T2Nq)&q4a~g+%sgqc1-+ z-x?rd|L68_>d?f7@EkQm^hdzL-Y2^^T_NDu(m%ua$&GK({oG(8Z?rQlYDW@GPWMXy zkJC&QYaJwmc6rwopE`2#T4Q*yQtZ!^rTlDi@8SKmvyTn7P5w)e)(VOcaiXZOx&D5` zCZPYx$;-EczRMxER2Avu4U1@(_x=I?(Q$E*j7rw-FhWU7OFD2Oj(c8>A4-S=JA4L> zfOEnE-moE5f(C~P=s)N-`Vodk;w||9bBc7qsh#gELJo}VHbXWG)tkoFWAIPbBEZSF7Q6x>>0}4GcwksQiir5n^Ck_78i{fP zC!|oVB82C#HWYBS^>AF^l@#GXv%&GrSS#GFcih{O)LsHYDkV89vO-aCVc`ehXsZ`p zmNy50om-`)q>#bBBBVSG8FjJ1wE*O))Mn}G2USKLev|+7`b@sFlS{qbi5;s?5Xc!n z$hy-ss=|Fu^Bb?*&lc_i?=-(Z|CVH37v6a9aSIrTr%v*k2al(RnnJCH93|OK0K2$= zNl>>}>@IFmP6q^%Fx+WI@5jde;`>N|FV5-+;e`i)b3X=IOG8s6$gelcAgLbw^T2fJY5m82l#>c!W492 z0B@1H;9~0lnm80ms-aX63PdF%VLXnG%dM&5z-BRD+|10jSEj}sn*i*$uo*BM1e4=B zS-czN zb$l@JqV@_CDo}~Jq)gTF`zx24+;!w!F|n~LydJoLUxU%D(>BATueFsn(9gr?-ToGs z+;}GY$==(Ge|^tC=#+&40%b&iskaD8L!;Ve6}ruUjExQA!yQ$0e7v7Fac6n z)x*d{i2|ISANuwOYU-Jy-~l}}Pt;o~O13+{g8H0*fdS+=QxMQW>hTk_k~nHCnUz5S z^O_tEpp2*TxjjcGnqut9lFug3FB8qF{oQG3;1Jl+7S$1m%Vqb|UR_+g=S8g8Codup zzqYQ+qz>z@_yOtYl;Hi2DwIMJD+WlU&-f`!n`c9PD!1dVa9Z=j2*U0cYD`6C zCA;epQY6v;$|YfUcl!tNQ0G`Ipz$(X{lAf%m~9co!V@}dxR4G?+LE$j_*xq|k@3*8NtW2LjI0G-zKaAh@%cN~vi+ zz>u)BV*!a+Qy-%!rjBZ^Yg=SJI|K9|5RLDE3-yN(d&@(8{eR955Zo5r#_0-g^olS= zUxDtB&q1;#*gj(Z8P5y4)|l~Jp1dA7i1AcSE(&5g6GzJw0tW2Uh&yz4!t%Gt~wslou~jVGF^#W58-C zB(om05Q^m~vJ9r$j*Ri5+tFgpXBi@ZZ6a4W{y&Vp1yq%5w>G@!PL-5KP)Zu4OF|mi zfFK|sA>AMyQW6VP1O-GIq(!=<5ky2lK)R$;I={Kx?>XN$&iKz5Kf^s7gzUAR=YH;c z&TC%ban|6*&aScWDSEBjUic-5i$Y1hp=O9s(jqXiG2>qe20<&KlE;ZExB*11m-IaZ zpcBUX)05l2Qb#k5ZUOh`$jMvfNiN8wO-GvOs8^Jt;-Y{E)^(@Ysrh2U?@zJc!C0PS zOIO{#^hd{YWZx#c=*?tmYeHok;S?3|tlZq;U?s~N(*gC_W5-Z)@%)jrbmC9x1N5+I z(nJXmJjM)FeV9eb`}xVqBc9|x0!q$fOUo}XcSH@4X@ks*fp(>W+E!>7Wx|6%`L=#l$uJTW9);vhl8^a{OB0F z;w6iZgHUkTVtYK2RYwCyel2j7j zH^tJvIi%=Chj~pOGt}1BetW{H$Hl_S~o?6g`x4fKg^1y;m1XHAVMIPoXtuQBX{?cnyI9%qdKYq^yWjQ3~@tg&YE_O{} z!aXY3WFQ{$*6rK#75%JfC4Vug_6J8NM?Z>Di4Q|VzuzOnVA{p5zePoZ;)rzvb#;@!gP~->~UG$?k@lCH$K|?z6Ws5l3u^s z{=P;2VJ_qzLif`B84bgzkvnUkyMC*2{^xq99Y%Zlv5Yk$jMn+M9yydoEyiZ3FN zG6lMIebNcOAz`KgD1ff|sfA+f@7(FhWtVyovaL_-3z+hpJpb`AoUEuc?M}3dg`r4i zH|)_8C+!xFgHE+OY~dudn|^7DX?-sP1MW?A>p=&EDqrxU@!yDfoIDuJ5?(smvG{tr zFmIJ&4IpyU<))Fw@87QTu_E>EqSBO!iHRs3&X1U-YMBAox`z>MOe^kTf5#jW(Q$FV zOEsnCzf;qNrL0noC*;xlhG^frIlwx$7OkN?NQc(mak)+ul>I zmn(z00`{Z0)fY^CC}sle%!{0_wI`FS{&{GKVso^j(|bSS0hLO=t)D46I=V6xGmefW z|8-@zx5F~^{wz-@rOHMCWO%N*HkR@tWXzsTSornI{ai9~@*liZ6MfY$o~~0-TW3>B z=DdF&WXYK{KR++;x8xm8MExAJVes6pS)2A=PWeaBiF@gMfBb2^sqyrCwWjIP39azC z`w8|)Ti@>)+0gH{pAgrje4f3V^hNNRAK^9`HYiUGxj|{r!dZG24f0KaN1tU*4p!EF zX3)MbX^OLW({=Q8L_e>+@Z_!;a>w-YB7B;!!i6yW z!k@MisXW$R6)qQW=Lecsezp+TRpe&*ZK+JAH^&_B1h*wIbK^1z+= zmRVRK6v?j3-(>-tLJJOF#=zM5^CxS{9+I5i&Sf$qF%a(x0c-_Zr*F@%^$yrpK8sMA zSz3y2LxZ-Fii5CNqneY42+(OCMX{9^8v1{C;mk@9@%}zL9o@0uk?p#L9U7d|o8)rJ zU5yq$+AIwRB1k9t>(1Mhh{Z8TE(JQxMH$f0(Dv*Ib%2=iMdG!JtsxD@ix+S#=Bdgh zS=m`AtU19<8k>VC+|+Jmc64_BsCJSUGltT@@}C=!W%dH45uwTfUgezm z%8zX0KwCq@irySL3GWkC<$`RtrEkT*0@U_ae!Y78_APEc-#*TNwk>}@xT^Kx)i;L^jST=A*RIQNEQU3wGr$Hx znNyo28c1`S2=E9SwzN$)u*JFcUkCZ@J=nw^Q}PcBPrHAps-l3wv0D9yVH*ja5l|=p zZoEtw-vhI;*MN9q(K#8|+?=fQ^q}vbWr+w5*Da)eL+!ryD>f(y0jF{scswl znbj1lh)7bBi4Q%Pe4VfZ;{(|A1QUVNp#X~wT3*7tfh4tg7`%nLul$NlEYvHrUpXYC z{ zf~%d&7x`V}e)IsZ<`)0Y(1D?oZ_QX(SPkbF^{HR$%XF(*lw#cJ<>6Th#UXb6R%r8s z!E7P&F`mRXpx-`+!VJz1z(Kx!o`1Esmjz&PJXzbzH}DFeR2WL3efP-Pl5S}xBNSfa ztCc}((a@K#VP|~9qD1V{@r-ll&*4)2R+Eb_bHL&=&asbAvU)#_jvAmq?~fnjDlB`g zI+5w0U){QY$D3FEg!~~h?4y~P%$tETOfXo>`S^i6=yMPPU}47FTiHXN|JDLEoS=h0 zXu~BTaPq7zE8|TX$;o-wHGh+v({ioK0fA~T){k7`u1mUV^Q*_INlkwJ0LnKB{zEfl zFA=pwGKut0F{f8y_3iDfQ1U=;ZUG1eYM`R!?6YtPy%mJL+BP%@f|esTk{HZjm~nz8 zCLZc>nRX6CWuh@W1)^*+RM%kCmRy6 zH|Q@hmIfAa?ZwITK&_iKo&-+@$c_d<+=wdlpkJer+Dc3W*yJAe)2n}v;O+J9fvj(z zEw0E!YFb$ljddAnrc@CeP8^$0MruDp_2RL0{U`XmjV0H znwDcPXDwc@zS=ei-IZVrY*)C=silFxKJDml&5VD#|MXkb^(pT)_3FSpv6Rrq)wU{H zTBJ~34cH12(n_HRwP&*?SpuT-4FuC!BRJ)r8#HlrZl%UB>BRnQBQd$IQ6MpSU9-UU zygv~g3m&4+=H{Y8$K0gkm&htNHvN_wmmsLS`0G+pC^3Y%uyuN1vg^6tt}$oN9=slphKHx6 zNY2Pa`ab8=p6B7~@u%aiD?G+B1kbb?NpU$J$74O-l62_ub$Z~tHX)r##rdKk?a|V? zq-Hw#in!7bFR3p}l1sE=!0M!5;EZ9AMuWJ-fI!5pTera7OIclA-d;`3=#8e-SPYbe z5SuBI@Rq_aPo;2>$@d8NYq~fI!ue!R1vdmyIE-)6Kz8d^0i+4W_b%Af3LZetk6eMS zY``ti>^zd-=`E$<92aT${d$GhV207viGDg(4vXnPBI_a?ZYZiTm$$NV9YV1Q1+lCcN8XkM{m(J`F16 zHEUJC4GC&KTSUTJt~q{zA!t}ERYljNM%4+{p zJy3JqA2)vqMk*~6wSRaWez~jFUzI|pi^j?EkUv$2G>@a1(8HZrCy8K6(=(B;zkj0r zR`2U`_H6){%?8f9?chm#wP(X~9@&3JJ(#D_#{I{sb9;T(!Pp4=>~m>wi0RsMHH9OL zF@dJn>R63&lxe5tL#cJ&h(MNfd$+eR;Z-tjUT;)xCtFd# zO4!f&bAsr`kH-H1`n!a5rucABp)SaFv6DYe zX+s@NrH~K;5vxcP7__!bN<_h|hc@uJ{P8irELYu$d<9r!y*nS5-Z`pn8pv{hSqQjY z+3V4!@+`fVl)_VFX}V0?nhgxNxG$`i$rIo67=p0V=TZytF;t)@Rk=*+8{CZ&|13A-k%!1PQ8@pP%b^1L229nFw< z`1mm_yu*kzwAe^02<489tn1i1oIfX-A|Pf733~CuT#tBwv3vDdv1XHcg|NR}vUq9Ml z2<&=}vU{eVr}~d&^?!L!|NAL3_W!Rh!~g1E$Ljz4)2nO+y7)PA$2mTlwuv;%36VGv zk&*e*{b&YQ3hqMi1c9wamNG3rCVdhu6j!B<2l$Fe>QI%JPM8QAL0i!cVoU_k*XFhY zeRCa7FV7cC%jX9-MnR2f*k|`5Vg;za!jKNiPZ<68iQ%YJro5bI^RhFR3D)_L*yrPe}NJ0ge)=M?O>* z6ebtj5z}&|$kxk?Iemk=brWUFj~dk}{FWSX>7v-_Bhgt(Bo=e+UyOg12tdL%a4Mtj z=V@9De^A=aVvvklSa?i-6V^&VE9BO@4+{zjnQi>4-rhMuZjX*IbhTm;ls_5lB(8qL z=SE?kX@T;LKmPxrKWzf?bC2HOVT`YFbb4TUZ;z`G;HKaCpIf9 z8@A-@1e%ym^d)SP>0bRaF8*L$yeL1q-kl9j)?E zjTncyL4^ZFVehvz@#xb{)8Hd-78;sW7RUO)X_K>~uFKHhxon_pVP<2a09?BR1Of;| zLBSJcH8lkf4c=c+CLIR-cN4Ac{91yPw0>3l7KTFdg6B8=DDMn=n zX_Ykw@o+-cPf`I82FO%g&~!xR9CMM$IXcNzGBR!HS)E1&jP4hUy_n^ZZgQk#XfiUm zGw0PKI}gKcf@Y`*|8;%;kM%sfO5-kgAIQ<2nOCdEotiN^I_{E2 zomi>mG2$MbN?-gGPTTQ)Dsk@G(NL1Yh_^(TYY=BGc4A=(`5u0|>LCg6L{{ga1K-J`>*D&k_U+uVu6A@dl= zVQ4}E>;kz9dt*}LIE0YA-8@aw+&{7= z=N-xL9C~g|q8cBwwvesI$!}B2+?JLMn*6XhqyO&qO)(UcbyW3UTlo0Il9i9Y==i~< zn{U2YtM^`6OajKNZ>4mxMg;1O+fAEbkXf@fm&DRbVkahED@*P}@%gR3CR6V>xd0+3)9B@+vBtwNLK$|{qs&~V z$TscF0!#OK;N{w#BcHLp)sJuA+FqqFLHXzcnvaZn$#&>%n&ql!W}ru5)%Py6RPsP{ zvvDf`PV#v>q$F{U+!qXQx~S*RPz-%DxIp#%u6b2*vsL4GRKPAF#9D>HESkH{w~8X_u=PJv3Jd8JLtD6GC!i#Xr!pRAxYNl(Jr5#xu->bjUW0&Jrle2Z#osCr*dM#Fs#do^A21S8<0!W3*i zAnhjjn)2U5as+tc%=Az9?7Hin={Xq;hYyZW!SuhsuF!7?u!+%3d(VyEY%oA1jfZ8t zk)QRfbv`>Pr*DQ}kmn5z1P+&RND&B-u9)igI}1{@&8;Zn-&H({=NO0aeMxsq0G zYil%Eg(|BOq?!L(+Mfg3SSZ8!a+j$0Hi9!TvPAVdwTfU6*MlZC($N!EGu`A1%( zv+iQPl?=5H2o-}C$159QAsor{)KtRg4)m11&YlenG^U`# zX_GEDYE-pAvyQ4u;J>=()?nfIpB)(WH>%u5eWcA5=_!ods&7LpO}hWtM3ukbRdmlj zOT-`=(%QMoB}xIkQG=4-Qtc4^;!r)j<;8-1z=)xV~m!m^SD@Lf17n(Src@~VA za1@zvJbX_;_XZA#r;Vha;i$vFK_v@Rx5#7W+`|i#`_@yVm?2-FTgHC^Ht%w`BINkI zSC0W&vl){3{P%3cxaA)-8=7GeA3-wk9*=>L?(bI#8HPH(Gnp+vI(oFsn7MYi#aI{= z$%uf5b|9SU=UwR^N-NZ2C1yte?ZD8Qr2DXR_{n>10e8~BC&BY80x~>F<;*94aP*nY zZj{9yMymBlk0=Ok|91|@|J{-Q?$EF^qdwrA|9?N#-f{_$VqSgmtesUYU8J2HuTuTL~H2nqdTJhgO|LMg|PvsL!B zw!&IFJ}@}eGU&Mo4YWn;8omB!I}x}?=f+c8Umv)UQaY`dsm*ryrAoRz#|i#he}YL& z3|^Ffoo19SeimQ3>SEos7v$tjWJr>n3=vOM7Pjan-P{KJZ;1HH*AUXR80?37>~u`qH{mvdzZF=Ts*C27U~#(?h}`1vi2v-qhW|%V{J)ganN#y(^a_{=EskM`4=BQ=`J~G+9ON*MPQrj%3j>ed>lG%X z2@&ex1(KiaFKClK60ZKtfLq32;z_GtkRZuLtF!XiVV;|tt%{DB=KJXI^T-U0u?J&> zbo#-{ta7@q(8&1$eM)_nyJT2AT4K$j6^Vz&g^cWc8?*3 zR33dsMoiWsJZ5GYE^-_L0tJj^@m`L<%}3@%r#S2|g83?}IZlq7{ zvwD@7nAw!^?%KZ#u5thK^F$C6w1T00UF9U5*90CIIsxe?LLyJQkk9wvI_M3+5G*QQ z`9_%`7jH^m{)Z2(16dK;2D-SiN11E;!13WTKkAP6$CE=4M_f_wQ@>eyv#lcp{pdV^ zUUcYbOsc>trumMXjjQhU6eneWmR9gmIRosX5CgS1CHe5!oPD#B^qepx|D=Bkd zX@pJWa9Kzi$i9NYLg)wzu9|B)ZwOOF9F}(v_-n6|NJBQp=6EOp<+q9!)Ydq#Z~r^y z0c_!u#PnC#HA05X@$l%cxU$csm|n6enDc48lZeaAluPEeq9PoKjE(IWdNSzTMQ7Rq z0P%Kpv*civ@waYmRMnx8CUxzTbfQkwaxxWFX6E}5r4~@boOdzIzT{2`4I$9h{B@z< z^ey zS#cup-aU@ZvmRrE+Fhphj;?vgfw0KAkL0TLy#?+$czP*Bl+n*;cWdN(M2&fdM1(S$ zGSGHh%9G!U<4s>qA-8|@-hN+Gv;4O4uyU&*_9c6qSM6Cv|GB{WJY-K4n)+M=vCiiM zy77{+r6>0G_5{BA;0pgt;cG2_WC{EAhZ+jTyECDMTH4xiOX-2a=F5m6kXL|a$J6%` z<}%(Frv2upaSjGGGkV#1c@;kj#(($MQ&(6`KI{B#b@eI?N)R)DP6tMZFwtcEEv{5; zPGMDdK{0f)U*<*nZ_8f-dL=4C6^4*T-@`p$>7!U$sc?ACH=jind9S`+ShzY-bwr$8 zOz}$p9}k17l5(;OPlvJjo%dx$g!gjDNw`e$5+c)rAd5;Oa{0p`OxgfRoY*QI{yvIG z?~i~Lpyx-TlJjG2xBZy2+8--~@qJO|$2LAWwhAnbJOR;%w3$rkS`Y3=fBl+)0^4ZG z{~puE4!~qVJQAciJ+B1yBA_OKPjfa!1RN}A?#w(-#5g!d0z&8J^me@10YoFb{MJ`# z-oBmLKW2XY$6Lat$-Jx*B4XWN(IdW(PSl-4qQqGIe_kXGi5me(X!yLQ{A>i@2KX0G zL=_tsX{3vNdA=3AUSyx0mt!`|O#sf!I1ARw8fvX&8S?d&eKo3HH{Yt|Mp}Zqu(77x#-%6Yd^hV(>y9VB+$z{UJ#(&|BXhRk zdiUUqt(y#U0wWVs0@3rxd=eKiV>rdnLi{Ao$MYcIN+LKf;Ey0=j>h&&j|W?HAzMad zM_%`WvMyKS4b5(iUY&-g@ zU26m8j?{bU#-)R8^ZSZ^Q?u?Fi#kayRSutMmRl!U+r?f#>46v2 z9|~FeS+7Fdu;sUON|t_`i>v)t^~lV6ZN-Q?)=KdDYy^Ghn%z_oBW~H)#^^_X&eu~F zn1$fKQCC74_!*k@@R^rZ1y^0l%guVDd2ZWz5p^z2*DY6RQ1(j%tlKnWBB2{5ZqE99 zPu%~3P+>6Ppai+yUFa<*1W(x}1bvAqZr2f=9&WY0t)5m;O%6B!0^ZRU!zJUMk}}8L zhYuxyg@h+9(nX*;mgs+{bqSv zTf>pinEr@gzi7bJlom7tx66-Ts(Wv@{DV?Zan{i475m{jJ**o?Juk_UZWJIu6Ly?> zmUGAjH@CSe7h5L^6F-c3*`;C_Kc$U+&p_=J8b=uaT+=68A$Uitt7|3oo~*cX)fY;C z>newmP9I{&YFao#AS>hGO5_c5zeDlqwVk!5!>M{uP4)ldsNjmSiVB1| zF37Hj{6kXG3eS|}`ZXJXgNagv=caBP60eHc*xD_EMaQlE2`pQXE~Zfz^2@lFwmPx4qh^)SUOkd)`O6-JDQGUACh3#$(&bn$hH{ z9ohtRFIOFA&?Et5$S2Ihj4I$(KeR?;0T825o!h9Up&|RKB`72sOVX#W*SP2mEf6{F zW&iLxWU<)`bCQ^|>rFMImzF+-s+}i^U`@m?<}_(iB!4Zlp@DGR%U<67721wIremxj zQKKHEi_sgk@S?A3NB&YpPfyk3O#iLRHb=c4NyD!2yFYDu(E+viDGIMyYou=u*a3t< zkI>T7`<1n^=z7PMU9CN=;Scm^5|MPt5>NP{1c*yt_oK*0!u=ufBX62m)Gi$ zvc>D#71NSkKF|2_9#f+7qnK#FrQ7#P|2}fRwG7I{i%h7&iz5>r8KYkxej!wv^;!$qZC3S^d+A!FWdO- z4Ma!;rFlC)UE^3Zp55`@p6y~FI;p1zq^@t=$$ap4ER`55ofp@`NR@f^&+kQKn2*iF zT*Ksof#ecHB~18$`c0W3_t9xZU>m$Wdjkc9b5sr^kt=GbbGDw>3~T#@z^`G)0u}G@ z`}NEYZKpSjWAiy@vh<}D#F(MxL?k`|KeE4oXH{ny!IHMIG2IWMyLlt?xnpk5BWYf3 z8=kYrfs!MOhj}^$C|Csau#Z|oj1u0yfY3YNT2l&TTD9B>UM#6*l01#{)m`Bfm}L!L z`jDwaMdcS1(+$m9oW>Q4daPo?4Wa{hj{u);;{g|FYisBsFe{`wG_k*wB2f-aJ$ZPj zbiuXOTPgnU0o>cM=sGKMd1%K~YkdoKbG@cLNT42kmuDu2!F)IfR+87*xzz}E5+By)X2PS1>GcyHXmaw>kx zzI*Ck@4UXOeYR%WpV80|gHv*aGpY2mYH88tPhp4x+VVd_)0?Qi9(a6eTKeUbB1*yA zeVB#rHT4TAOvuVG^+&Z`jfb*~G=Ea-IeI~|{1)2Yq7*cu^R`nwOAN|_*W>_(cxkWyy|7B|=U*RP3-6$wiF;U9)X zQxX76jeG~werswHwKDkyB3fzgsf1ozH6+#G0}$8VlwhK z=cot(h+EwDU)}q1d!Nt2-v0Ae;H7&~uNTF)Nk@@@%hSAiznE#`L*n+i&HbjPGa5Kv z&UDDNlOkbkfzeg$#dU!7Ea;h#3*Dtnw1W4hQ~%sCyqwc`|% z;RAQ>9L);^T7~H}e<&^v?Pri;WV>-gj(Kyk|BV6bfzw#o8%pgcY}|kcQIXj3Zw9U3 zj}2Ytb4PrR-*X?e_XOoq7$BnuU>$TQsjR6g|MYH0|e zx(oAA&P}7ZX6Zv@q~)HNEz#sEr$!pdeu8ghyLblCtCArNRXh zN@6;xAz{VGzdo%%i8QA7TkZlYRl+6JRPhp*&{T>aK|iJx8H9 zWJ!5+33D}CT8HpPtXt54Vkf6EG6+PbPkcDi<(?> zF)OQ)o&UuJxcG}Y?d7mgMDKh)=iJU~zQ}2Fg;Qt=a*6Uz2{6$O>Nn|%YMk!8yJ&NI z(1H;Uu}wx!rD%u=w?p!;DPC?y+ql+Xk=gx?KJIzX%%+D}BRz;TTfuPqI zqee(Ixv=lEbMUL0*J-K`(m+7TPh{lS6MLW6>MPZCaUab4d1_%g1?}-MgmA`#c?h{v z)3J{c#D;6mqHt-jHcgd`i9ETk*z zpKSlu#PJ=^&9jD$>A>SZrsW=M6sUY&XtDja#HWEMOV4V~XZ7t}C|$avHQcGc6HRnz z+qN%o)_z?y`gaLKBrMhZycxd`j60OpIVxQSv0q)K#6W-qL+bKO0L47$U+MrC&Y<}& z8V^UzMoQ9(NSRM`X8%El$(k%GI!@FX@LUM6l!(kvQXo}WXHpr7M9ARc zwy5iTrBE3;5J^asLBVF{kS0Bhp=_o8y>iA`R7>Xp&7Q&UctRLH>k%7s?iZnF28UYw zog)ADsQBNZ^1pW)H9AHiwea!3eEENV`#(ROPmm42dkqOmdflnoRPQ9o2L`ZhJ{d+b ztyYixIXy4CV-G=@Fczc7-~BUtP$NE}2s_A+1zKJ~x0?#gWWXwOhTxH-1`|Y(URKAm ziHC5z*lp@j%m@fm-uh$K`Yg)qu+iaEkFcLUZsFBc1en{&m`q^_3Jaqnz_u4XQ75e7 ztl|9zj5ESsvLh|L51e87g|An4Opxye@LY*ffZa^tTlaPNsw_iJ#6ym?k@yjmdVgE-^(9>cktwo zq8gPn+K!@yk*|c;0U^YQB7%yF>~ZB#QWM#6R0^x_;l^EgZFAb3g%8JWixYJX?Di8=+X>oDZ* zc~uY(iLE}3W#Vb@CqD9q7RObsTZyDmJ`8ezmP6nz0Opv0VN=}6nu9@}C}@{}3r!71 z^D#1vqz9~9zSHMY@H61EgxTC5v2(?h&w5ir;!l!v%Zj^P;h_1&nUS2vURN9~GB;N- z_0FG;sBz$6Y2CjcJ2yv;2tquP+f;zZ2{kkYO~3TXz)NrI4I@#PUCfW+mMmhzY^>fB zuD#qhxf*cm+Xkw(EPFRQ!im;qU2Dy%$6J4PfabmoY>5++lQCsUA9;z*xcJWQh%vqV z@?N`uG4Y_Uzr1%od~hYCe=Ag%E7*`S4C21bHdCKMKt@{?ozcMP_w5`T;!;KAP?kxa4GoJqyC2f8sH+=t}O!e)ujn_Dokye!5ut7!1n5yl&SKz zf#3LssOu5$x+ksL$DcliwY#!K5B^|dqCp4Elzx|s!U8s16e0zNsBTPW$o0A`gZW;bl1>O& zH05O6KvvgWn%7jw`SUB;DNB=tr6bX(nbdgVau%feffTNDuA_SP{BU}0&tFh*C@Uj_ z9>FUiP78ERCjCGHg4^cPO^t}4o*w+KZ$uc_HQp_|PlKD!&70jg2viCr$j-G!3#*}y zfi&;-zCV<3bY(Vt!0%(ba;85N4H@)`#fq7H^x9(n$T%l?iz};dX=Xj^$LR)6ms=EE_f!xFEgg%nySy>5>1pmITCVyYxoj5RgNmJZzA_8-E z@2C6G4oEtXbWWfBuI7d26-c8wgNM*ngsrare4mgaPPX(dy$uE~Aw8+h&h&XamCc=< z*k9iWR2QdtEI`Px!)2rEVkl5qoJPe(f%^igV(D-z;?O=vB{LN~E@30(2LM$q=ig+d zjs+s~WQiLfbH7fo1>e3M-^8uV(^Sva8-#b5epOhDxVkFttJ2jP^F)fRI1U;E{UpxF(FFIt zD#16(tM4-kZm|N@gAq4L15;I7$ArFov$e?yi9^X_qVUw?AFX8@$rVS*0F!i*4$H+O zziBD&29pW55pp%Ebl<*T7AOLOkq?7}2?OeveW>EGUq&F3dc$^mI2I@=?s8qxU?i1s zd2kC~Rn@FwoT+K9-&h70Mj-E-3hTXhu``S`sEG|z!UEw97 zcz0Q9c^Kj+jsw);)C)#y?rFy>m0e~RrWcH?I=6TzDBFH? z@XqcZYv~$3r--gqT_mBCjuN2caX-$kZ7L_bYiY^b$v*SW_cgX8B_(Y{xavIjFFSi% z`!$?tN-*3czjB4oYTaO>@iFy*N!{rHC7Wg)n#dF{7LmI8&4PSfTG7@gj!#-TUcBHL z&KjSW4KQQ6{_Q*I3JK;TH_;IK`vtn)w>d(9!UU5HYR}YrfvW229UIltc=c_;kRs(R z@s7vA+Di=X@@UR3yyN4JyS#6>9gtBa%VJk?{aji%4o|fWwSxhJR;zX4U{g=^yX%aU zzi+X8?HCw(?Olh)zC&y7%4+vokML@1&a1@Bnn}jzU)<;=WpGl^en3rAN5uxH>fL{? z*{-hEPk2W6_RK_+ipt%VGe|Ifh#969jPttmSp%|e_+PM?MIg6d&hO!MPdd?{)*s}e zX~tWc+_>oXdN^lR7gpCgUYNhqd!1F#@vP_9Tb^{as^q?WyZo;1ggaDx=8wncd8)oK|j;+d+MsGIu>Zs;jHVHg1*{ zZ0?O-O-gK8`xE9rWscYMmiy(s47~zqrL_zU@go)BosFM9meACPa5of+j*EES+f(OZ zje|&a6p4E$HT)#9F#iL7Z5I0`BP59Q@2ZY-19QeU@gzEE$@8u~QX{XTf7SXx-K}h4 zGpC#SO(>uTSl0b%8!yk{gvEz5T|wPn@+*aEb#-Y;p+mhd#m;EW!<&Ug>+bOZ-JTkh zJs&v8C>fB{gVwt^DX97jn*-)YKu&+3|LJNUH@9=$ME-}uyB-eQsU;;Ii@2ER`Rg;R zqYSt+_9n9RF9k_BY;C_k=J!}(&CYE?1ES%drOAl{17imwD4WQ2Je3W_Y=KCT|m z&?%7X$shhu7HZpeyf;YaeNY=X2bNy#9iILx4xY5SJ-nxS1uVpjB>27pR&oV88JW2s zjM&Z54ZAD_1x4nUzueC+Mow%sX4KwUPmAk4EguchyqdLFS9N)C><6I8T~}9It(i3^ z7R3d|J9n^zDm}4K7v{rlA^NsN=}z^FMm_htwC5aWsL>IR)8g%Y8$LKJ@dcv00w=jp5Ldo{Wv zUd7V6R-9xGps7%JN{s#ekx1jG9$gN#AM5JIWq0{sjuAq_3S3ROv3`NKf0yF^%UKph z7}U?3tEhaRCr%>xr&1{YL-ERwYep3vH0AwI|54{Y3oz}*OZ{T6XsJ##kv4ITy6R50 zia__6GoMGGPT5xOYOWwYrrGE#OECCr+8|y(ITJuY$}2b$cO?&4{OVcG%H%ayAbw6j z;QNo$-HyB6U#PMCb#=!rEIQ-D#%#li3D^^|+&VwoR@}X=-lga~8=*o`H0t73Q#Yh@L z5MY_zvr40@H}cuMlG%Bsy*j^0(6v!8d`pp)LPZYUP1G|2L%1HpqASME*M4i$xW-{; z128g2UoIYDVgd@D_D$pT>Ly2jx~uoDg%i^q+ML`Kh5uf8TRw?ruyvFViy5 zR}{JK$&*`tX_z%Ypd-IR4g;(qy+BETARh5YY<1E2c@NN>3<+Qdw6r)3kq#uxeR4RBEVOcdyl6{19rGBNx+xu*4A<{bazctkoVN zvAO>=;oaL1w)?8xM`SP?>v>BjN34BIs4(Bi`f2UcYA(7iJ^^~z$t8eQBKE|ALX+Iqt}BEQ#7g7#nu(Z>#I#0fYm5d`Ic*fzMap+RCuXh47)#iUh=*o&9uP zK0Mv|1nX&zk^5k=blgFb0FHU|Ej$reYsewrEP*;X-EX&?T`pwFz8V6 z@goAEq?r~zz80*&6>h*4uD~3wz!j#zf#;*f^+JZ3OqL5!0&-dA#H!+Liz-9;)$54o zoE)%CLdg59d##zH{*vpP>-WO0Lnb`_)3wWp(`#j;_S-n<-90^>kY;;4ua0U1D@*Lj_&*Qgc5Y8_>Fo5>C%E~z7p>u&F&6`mFVeL?c2x; zs`d3Df`DXTu~d?#tfu^o5jVfEkf?TC%fOqg`DFMuDJ>-qlzpAy;bmT|C=8y-PQU1> zFVO_u^$|^&5lZ@cwNWvU06y~@*O)r+WRN|S9x2@ZdF`-m%DZPeeK% z(#rg;Y=ZKI43Ex>*$wW6p{w9^5@SRTE-L=xzzt)5bD{xRrWQ)vz|4sYOsy;(`NSfH ztS?tx58GhC{Gm#CeUe0$bcO`;eeE3P_|l(@kCV)H2^x+(r6Xif++S;AN*;zC_((u+ z4OFAvYm?!Ew(45`#!VH_`qc}LBVj25?5kHCY?$**?fQwp#-Y-tiQD4U?jBWk?^&er z+UbDJr*nFVp`^8(N#D!4&2XX%nJ$kkom*r%gR<~)fNOmvAVZ)YwrlMcr)cv1l5Pu9%%6 zhO)chE7!Z-Vz{QMH&qQw-&cvd2zPeM73yU*mGdn>uHV>n``jr?>}sIc5njrNUpt2pbVS9P+Hay{y0B6@K>3E3<&B*z$#K%(>nPveC7r`bG4K z7@z+hmc-Qem+W8xz4z+XwwH8+iSF=_TFx$g+S!(dz76n?gmRqKPB;SVrMS79|@7F>g5bjA!q*_KdMUB zzCXP~hnA>=2jh!kL%N;E`nU9-NhTm4PPepVWo;Me^xUTFovKs~tWAJX+Ofkaux$>Bd_wj;5G5 zH)9gEHy}wfL9z#)T}c%WEGh1d241*^1~H%t(4MRtr^bn-hKKu%Zg{eGc4hp2&Ld)8 zPDPVQV;D~;bl%v| zFofw=fheVw*uy9T(C>uaY$V2i&_(b?B}XS;x2J4Fy>z&h-0C;q&NZ(%u{xU4!BrqN z4}2f}vtm6s7y-0zy^K$vuJXU(TCNq}YM=!d+E%b=dyZ;(FL5qo36}b+vAn^_dtpeo zJ6i|T4Q2DM>&|GMpD2nqYD9o_sCj|l!lt%$SKroQ+ilEvnpx&>jXZhv5{(KKo+Z#Oot&gkk&>0PXrwsT<(>wN|54$RSroTKR;8_7ehm4$^k5nb^m9mO5zL8>~c0^h{^N$YP967vD6XdfR(Dh|M zvhfjfRYIbk50e1;z?vvPq-_}af%Un%hu7ZG>HgG=2X>O7Y}RbH8*(`|lWf(KhSd5m z?%hz1A-(tO<-@wugw%M%lX}jQ9X>wg7-SbHOME;QC#|Y8>gqTal+>9MK>Xb@;V7Kb z*{KL_aFyr2zl+93n**hZ=_ioX0zShO;rl@q0`kn+jg}TMYrp&2lIjlEY%`0byR_^N;OTLqMif-jbz!par4a@q;moLid z8X+cmYp#>skNH_YiF@kvE8Gnu#BcUPrxVOTLp*zp5=m zp}oMhxC_X-&dV1*4Nk!1c$LkXD&~Ry8rLrDKOD{UfP-5Tj+EfUfF6~-7OIwre?#X5 zIiJgf0bG7}17SWMdTf8)q)>IAdux*6MUlD@pyglX~Sl;Z>DXm59N{ z5&2_HTSq4bwC6Ps9YM2puqu@DmIl(qWwY7XTd2m*Is5qE5WZPip~JaTfGIy10kf_a zhV8ahT>4kz0Xe&zIeFPK1zL~Be{yg8Na`1JpZH0khW9Rfe901ye(hsb%oi=>(R_lE zjf0*Nf|8Q?F_I-Gz$^4I9 zobL>Hya$`dwJBem!->YLSrH^k9>#PuDJd)mW+S$O$}0Ds=@qZ++C_GlKhDi#xmT*> z;o#7oSec`9>qU%WdskAua-KAG!~=cC(SZ9>og3 z>ToU08_Eay1U6PG4JUZb(Bs~Tg@xz-yi1(re)67J3huDB7@f|G7w>g%I&aUQ*^f6Z zzOC#k9+v_lbt@?SGqek}|G9tVELC6{uK#>*15B0F*)a&-Rq}VcauyKS{Z$Vw z5Mi5!U!W2NW{fcCi1gTM9Cu=(vN0a%fYYGoQBZBpqK>ax8*ov;E1eg{FlTd=(sp*f zz?%2o?UHVRfr#&ZlNvW0%IORQKsOW#X~R!)6^DjJ6dr~`!V?@iWCP*(j*S|wa?I{D zbRX>O%-lvtp-9l?EMn48X)5ebvfxwxgN^a=`j=`+ zS715Cja4|c#;jDtzf2>F7{n`_#I7DEz(vpIzXijLJwu0TbR}Q0SZudE&4|H8IhCha z&~vadyR6BWH6B5#2uPDIU5W^yhmKN2ASx{`kO+#R1YrS@9-=G? z(p7{N5Ty5Bq{OHzEi|b?sz^(K&_WF&cXIc4U++Aer(}{dXJ*cP-@kky+yrQfh;~H> z2r?@lICGq282i;_4qOueVk97?q|OTtPXg)ufNXUsTQj4kiE1n;5LUtM>kBA1 zi{+ZfKZ9y@ukkWoC5i<=F^T;GZ`zIhHCV8k*VBhUQt4}hiIs>huWHe9SpF3r4! zL{Ew2E7wt|7dGiyISmzWjJ}x?+5QzOH2nOi257n1AW{R1dvhA{Hp;Y)A%+o zbAbQD-{~ZjESF${(ncgPf{NgV#Y`|8%Nj;XipXuT=d^IYAMcmPxUE75J8wmDQiWzrZrU>unlk z-MdVOnjM8*5SP`m9ru38ILN({*491?@N7wG>DrFj(iV^i4zSVOqF(#~NCs8U|9;x2 z5+@4fc}5Zx)&GE}Kmj)_>Xc6#aCmT2`@8DF5Hr}YZx7_O>4ffbC@MZhSe%2Yu>k7C z{x51jZ8bb!rqC4t!h%pB1GVI!z3nEOnwS{EvkZn1fv^%HZU@eOtjkSTN~CH8)d2z* z2o)q!2sBD~sDXD~S}#tQEM^TjpLI@R8p1Ys95`fPr|w1ddau_8=+dNvP9B-?#AJ`$ z&mLH&X=1?H?+RI$p+ivd1AB;n3XlP*+rmc22&J@Wjt&Hp|(m5qLXrN_x3z{G3ND7=4oera( zc4Ym0U*l(WWd!et12E#H1i3CKw$ccm0Bzl!K)*1R3Zsf#GnPxut*PN5lgWSTW(Lhh zMIcigh90;A7Y$ut@+3>w0Kc!P`FT9iLi|xg&`X%ZFRk9=wN^c$)j1-Q!=r+AXwne0 zl8JtD<#JW=3qM~ciuEmpI3L_K`7Re zi?+xf5I_uQ&SCny&Tub`;62JfBrPW|e|Lp2-|30ezNrtZy1w%}?hwF*RN?EHH z_BVDhmFqx>!9x)oVtY_pBBEnQ9vQkqt zopa3(Qj&e+8y+6E2n!37PTv3hD|Gw7BZ~~YsMI(S7bMZ95xA$;PHXMIthRt73DM`OVg z6BFb1C{#gn^SIS`|JH)i>$J4thv_rx#0sPjuOI8H^B&K7j?#J0+dJ;QV|Zd*c?jeL z83HO7^?gE@NduBIMgY`XSWq55T*sF-`TOH%J{H#4J{dK>IS!MOHDh9mqUC^NP<_3E zfijZlZapaC(<;7o6k{19>HpyLNqVmUwfD8mIwa-dlZg{YXm6nQE?KL#HTb9*Fs>25 zeb_&NLLAluKFaX)^z@3Mnwr|{)W(fg3IgRCuwApYR=YO!h|1^SK)I`nlrV?BI2A1w z{zsF(Wt6}Fh)QcO-xb<|!l-QcZxGb8l=#y2H+<4K0) z+ap`vq8)6o_RoU34~D#N^dbENNI#yJ$g3bMJUW>6s1!w#rQ|KNr>Cxub4bWDIZ!lh zdKZ{yl$29`#y0E(EckW!zJ|f<5QX_&b34oP+B2lNi14z$gl`mK5W063V>_;;6@{K% zT$wMn3t1`8#Bsv$YB1P*s*9CXY;$w74qIr3#ir!FcYblX6NT4^t9onpBhyzM){0w6 z$9H{PGI%a$a8=ZM8crN?gxVFr?Rt}?Q)`Q4l~NhOLzT+kAaT8tLzafFA2kV!h}8Kn zJsu$vhlJb~cS1DLqt`S&;0Yjkjs$mn{-Ui*j=#;cUD_V28QyOPRr6Ba?*`X$y=s6{X|j<0j6OmfBi7koTWzh`(aV zwh|)qKEp8F$-yC%e`&{)JotQmuW)&+I(M>-H8)#iI9b|ad*FQ}p>@_=8Rb$mYW(Bn zxzJO&i~WWN+d?6%(VUZ;kep7}sZG-30abHAO0f4{(>K_g)Ya719)dDTC_pW#>rED2 zT?!$aZFo)s)RZ8Wcy235pFn87{Qdj)5E{8q{u#>^KffA*3!SMlINI{!XMMi4Ao?n~ zUB9t!)Zv?!azA=OJSK`|X)dWh^9y5i0h;*?gmelspRCt}ojh?p2m)I62K}m9SA~_} zHYBk2NIc+SZD8d>!geUU9LC6%MgR>J4U<z!*>B$%^pyJr@SF9|@CuUVr&@el_|0ovv6|8d5Nc@rACnQ2L zt7??=E0(se-}m~)MvL#6k%@o5asup@5Y_8(4JyulGkTYcyV9>(HFhsUb9Y2sz`c zDa8Ou{*m(XrAYZ4OrFd>NTTxNOa>9{%e;t1tcCaY!NaxEgaWzNx`36Pgq1!`HT5zL z2XmnsVUwlZKVk!Vw(mwoW$`l6Z-2jUad1!%S$eiDGx4{*^52c+lgQ7Di&M#u5qTdz z=zLZW+wYId(C@mK^hgXj8WHY;q;}Tid@(Tn@4$rIti2cSe`M2WP4RpB`&}ih{cHF5 z%vHI>JerI|DZ4aId8Jr1>+P>#I2=wi7N;AB?*)Y)#fziYss!}VvJ+9$%{v$GQ0!`&<25kul2T%CdL*Uyl6(!0Z+J{r z=UY)lXm^&;x;z+o zK4H3knb - - - Name - Arduino Opta® Lite - Arduino Opta® RS485 - Arduino Opta® WiFi - - - - - SKU - AFX00003 - AFX00001 - AFX00002 - - - USB - -

USB-C®

- - -

USB-C®

- - -

USB-C®

- - - - Ethernet Support - 10/100BASE-T Port - 10/100BASE-T Port - 10/100BASE-T Port - - - RS-485 - N/A - Half-duplex - Half-duplex - - - Wi-Fi® - N/A - N/A - 802.11 b/g/n - - - Bluetooth® - N/A - N/A - Bluetooth® Low Energy - - - - -## Application Examples -Arduino Opta® is designed for industrial standard machinery control as a PLC with advanced features such as AI and connectivity capabilities. It is readily integrated into the Arduino hardware and software ecosystem, including real-time monitoring via the Arduino IoT Cloud. - - -- **Conveyor belt management:** Arduino Opta® offers the possibility to configure its inputs as digital or analog to flexibly collect data from several types of sensors. Thanks to the Wi-Fi®/Bluetooth® Low Energy connectivity, Arduino Opta® can also be smoothly integrated with sensing boards, like the Nicla® ones from the Arduino ecosystem, leveraging Arduino Opta's potential with vision, sound, weight detection, air quality measurement and many other capabilities. - - Arduino Opta® can use the data from the various sensors as they are or, thanks to its powerful microcontroller, use the outcome from a computation, to operate a wide variety of industrial machinery through its high-performing relays. - - All these features, wrapped in a compact form factor, make Arduino Opta® the ideal solution for product flow management in conveyor belts, automated packing or bottling lines. - -- **Real-time industrial monitoring:** Get instant access to your factory floor data and to the insights of your industrial processes to leverage your manufacturing excellence to continuous improvement. Implement visual management and KPIs monitoring thanks to the Arduino Opta's built-in connectivity features (Ethernet on all the product variants, Fieldbus and WiFi®/Bluetooth® Low Energy upon choice), delivering in a simple, fast and reliable way the data collected through beautiful dashboards in Arduino IoT Cloud. - -- **Predictive **maintenance**:** Combine the possibility to interact with wireless and wired sensors, given by the multiple connectivity options of Arduino Opta®, with the powerful microcontroller computational capabilities to implement AI algorithms for predictive maintenance. Edge computing and monitoring capabilities, thanks to the Arduino IoT Cloud features, can help to identify small drifts in your processes to address issues before they become a problem, reducing production line downtimes and ensuring quality outcomes. - - -## Features -### General Specifications Overview - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
CharacteristicsDetails
Supply Voltage12...24 VDC
Inputs8x Analog/Digital inputs
Outputs4x Relays - Normally Open (NO) - Max: 10A each
ProcessorDual-core ST STM32H747XI Processor
Program Memory1 MB of RAM
Flash Memory2 MB
Flash QSPI Interface16 MB Flash QSPI. Shared between manufacturer's internal usage and data logging
Programming methodArduino + IEC-61131-3 (LD - SFC - FBD - ST - IL)
USB ConnectivityHost and Device operation, Programming/Flashing, Power delivery for programming (Not intended to drive external high-power peripherals)
CommunicationEthernet, RS-485 (AFX00001 & AFX00002), Wi-Fi® 2.4 GHz and Bluetooth® LE 4.2 supported by firmware, 5.1 supported by hardware (AFX00002)
SecurityATECC608B Crypto Microchip
Degree of ProtectionIP20
CertificationscULus, ENEC, FCC, CE, CB, UKCA
- -### Processor - - - - - - - - - - - - - - - - - - - - - - - - -
ComponentDetails
ST STM32H747XI Processor

Dual-core

-

Arm® Cortex®-M7 core at up to 480 MHz + Arm® 32-bit Cortex®-M4 core at up to 240 MHz

-
Flash Memory -

2 MB of Flash Memory with read-while-write support

-
Programming Memory1 MB of RAM
- -### Security - - - - - - - - - - - - - - - - - - - - - - - - - -
ComponentDetails
ATECC608B Crypto MicrochipCryptographic co-processor with secure hardware-based key storage
Protected storage for up to 16 Keys, certificates or data
Networking key management support
Secure boot support
Guaranteed unique 72-bit serial number
- -### Communication - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
InterfacesTypeProtocols/Technologies supported
Ethernet10/100BASE-T PortTCP/IP, MODBUS TCP
RS-485Half-duplex without termination resistanceMODBUS RTU, Custom serial communication
Wireless connectivityWi-Fi®2.4 GHz
Wireless connectivityBluetooth® Low Energy4.2 supported by firmware, 5.1 supported by hardware
- -### Inputs - - - - - - - - - - - - - - - - - - - - - - - - - -
CharacteristicsDetails
Number of inputs8x Analog/Digital inputs
Inputs overvoltage protectionyes
Antipolarity protectionyes
Input impedance8.9 kΩ
- -#### Analog Inputs - - - - - - - - - - - - - - - - - - - - - - - - - -
CharacteristicsDetails
Analog Input voltage0...10V
Analog Input resolution12...16 bits - User configurable
Analog Input LSB value166 µV
Accuracy+/- 5%, repeatability +/- 2%
- -#### Digital Inputs - - - - - - - - - - - - - - - - - - - - - - - - - -
CharacteristicsDetails
Digital Input voltage logic levelVIL Max: 4 VDC. VHL Min: 5.9 VDC
Digital Input current1.12mA at 10V
Digital Input frequency4.5 kHz
Cycle time for analog input acquisition10 µs
- -### Outputs - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
CharacteristicsDetails
Number of outputs4x relays (NO)
Max current per relay10A
Max peak current per relay15A
Continuous current per terminal10A
Short-circuit protectionNo, external fuse required
Relay rated voltage250 VAC
Relay Max voltage400 VAC
Rated load AC12500 VA
Rated load AC15 (230 VAC)500 VA
Breaking capacity DC1: 24/30/110/220V10/4/0.3/0.12A
Minimum switching load300mW (5V/5mA)
Max output line length (unshielded)100 m
Relay response time from state 0 to state 16 ms for relay output
Relay response time from state 1 to state 04 ms for relay output
Bounce time NO3 ms
Bounce time NC6 ms
Relay mechanical durability10 million cycles
Relay electrical durability10 thousand cycles with a resistive load of 10A
- -
- -## Ratings -### Recommended Operating Conditions - -| Description | Value | -|---------------------------------------------------|---------------------------| -| Temperature Operating Range | -20...50 °C | -| Protection degree rating | IP20 | -| Pollution degree | 2 conforming to IEC 61010 | - -### Power Specification - -| Property | Min | Typ | Max | Unit | -|----------------------- |------ |-----|------|------| -| Supply voltage | 12 | - | 24 | V | -| Permissible range | 10.2 | - | 27.6 | V | -| Power consumption (12V)| 0.6 | - | 2 | W | -| Power consumption (24V)| 0.6 | - | 2.2 | W | - -
- -## Functional Overview -### Product View -![Arduino Opta® Product View](assets/opta_panel.svg) - -
- -| Item | Feature | Item | Feature | -|------|---------------------------------------------------------------------|------|---------------------------------------------------------------------| -| 3A | Power Supply Terminals 12...24 VDC | 3H | Ethernet Port Status LEDs | -| 3B | I1...I8 digital/analog input terminals (0-10V) configurable via IDE | 3I | Label Holder | -| 3C | Reset Button | 3J | RS-485 terminal block (for Modbus RTU or proprietary communication) | -| 3D | User Programmable button | 3K | USB-C® for programming and data logging | -| 3E | Status LEDs 1...4 (User Programmable) | 3M | Ethernet port | -| 3F | Relay Output Terminals 1...4, NO contact (SPST) 10A 250 VAC | 3N | Port for communication and connection of auxiliary modules | -| 3G | Functional Earth | | | - -**Note:** The LED above the *User Programmable button* (Ref: 3D) is only available on Arduino Opta® WiFi (AFX00002). - -### Microcontroller -The microcontroller is a dual-core *STM32H747XI*. The main processor is a *Cortex M7* running at up to 480 MHz and the second one is a Cortex M4 running at up to 240 MHz. - -Arduino Opta® can be programmed using the libraries developed for it as part of the standard Arduino Core library. - -### Encryption -Encryption capabilities are provided by the *ATECC608B* chipset. This crypto-chip can be used to store sensitive information like security keys to connect to the Arduino® IoT Cloud or other third-party services, protecting Arduino Opta® from any unauthorized access in any kind of industrial and professional environment. - -### Ethernet -TCP/IP and Modbus TCP communication are supported. The 10/100 Ethernet physical interface is directly connected to the internal Ethernet MAC and provides full-duplex communication with automatic MDIX support. With an internet connection, Ethernet communication can be used to connect the device to the Arduino® IoT Cloud or other third-party services. - -### Modbus RTU -![Modbus RTU wiring diagram using the RS-485 interface](assets/opta_wiring_modbus.svg) - -Modbus RTU communication is supported using Arduino Opta's RS-485 physical interface. Note that **Arduino Opta® does not have internal terminator resistors** so they need to be added if necessary following the Modbus protocol specification. - -The wiring indication may vary depending on the connected device. In case the above connection indication is not resulting in consistent data transmission, invert the wires between A(-) and B(+) and retry. - -### Wi-Fi® and Bluetooth® Low Energy (AFX00002 Only) -The onboard wireless module allows simultaneous management of Wi-Fi® and Bluetooth® connectivity. The Wi-Fi® interface can be operated as an Access Point, as a Station or as a dual-mode simultaneous AP/STA, and can handle up to 65 Mbps transfer rate. Bluetooth® interface supports Bluetooth® Low Energy (4.2). - -With an internet connection, the Wi-Fi® communication can be used for connecting to the Arduino® IoT Cloud or other third-party services. - -### USB-C® -The USB-C® port can be used as a host or as a peripheral, but it cannot be used for both purposes at the same time. It is possible to use the connector to power the processor and flash it, but not to power the PLC outputs and peripherals. Additionally and using a USB memory stick, the USB-C® connector can be used for data logging purposes or to update the program inside the PLC. - -### Relay Outputs -Arduino Opta® has four *Normally Open* (NO) powerful 10A relays which are capable of actuating on loads at a rated voltage of 250 VAC and up to a maximum switching voltage of 400 VAC. - -The relay *Maximum Peak Current* is defined as the highest value of inrush current that the relay can endure without undergoing any permanent degradation of its characteristics due to the generated heat. The relay has to be able to hold up that maximum using a duty cycle of less or equal to 10% and for a time equal to or less than 0.5 s. - -In the case of Arduino Opta®, relays have a *Maximum Peak Current* of 15A. - -The *Rated Load* is the maximum resistive load that a contact can make, carry and break repeatedly. -- For resistive or slightly inductive loads (AC1 classification), Arduino Opta's *Rated Load* is 2500 VA. -- For small electromagnetic loads (> 72 VA) (AC15 classification) like power contactors, magnetic solenoid valves, electromagnets and AC single-phase supplies, Arduino Opta's *Rated Load* is 500 VA. This value assumes a peak inrush current of approximately 10 times the rated current and keeping it within the maximum peak current. - -For controlling DC loads (DC1 classification), the *Breaking Capacity* or maximum value of DC resistive current that a contact can make, carry and break repeatedly, is 10/4/0.3/0.12A for respectively 24/30/110/220V. - -In the case of the minimum switching load parameters, the minimum values of power, voltage and current that the relays can reliably switch, are 300 mW/ 5V / 5mA. This implies that with 5V the current must be at least 60mA, with 24V, it must be at least 12.5mA, and with 5mA the voltage must be at least 60V. - -The relays on Arduino Opta® provide a very fast response time of 6/4 ms to change state for closing/reopening, and a bounce time NO/NC of 3/6 ms. - -### Expansion Port -The expansion port can be used to expand the Arduino Opta® capabilities with the help of additional modules. Reserved for future functionality. - -### Programmable User Button -A pushbutton is accessible on the front panel of the Arduino Opta®. The functionality of this button can be configured via software. Note that the LED above the *User button* is only available on Arduino Opta® WiFi (AFX00002). - -### Functional Earth -To avoid and reduce electrical noise, Arduino Opta® has a *Functional Earth* connector (Ref: 3G) near the Ethernet connector. *Functional Earth*, not to be confused with *Ground*, helps the device to reduce electrical interferences in industrial environments, being crucial for having stable Fieldbus communications. - -## Device Operation -### Getting Started - IDE -If you want to program your Arduino Opta® while offline you need to install the Arduino® Desktop IDE **[1]**. To connect the Arduino Opta® to your computer, you will need a USB-C® cable. - -### Getting Started - Arduino Web Editor -All Arduino® devices work out-of-the-box on the Arduino® Web Editor **[2]** by just installing a simple plugin. - -The Arduino® Web Editor is hosted online, therefore it will always be up-to-date with the latest features and support for all boards and devices. Follow **[3]** to start coding on the browser and upload your sketches onto your device. - -### Getting Started - Arduino PLC IDE -Arduino Opta® can be also programmed using the industrial-standard **_IEC 61131-3_** programming languages. Download the Arduino® PLC IDE **[4]** software and connect your Arduino Opta® to your computer, using a simple USB-C® cable, to start creating your own PLC industrial solutions. - -### Getting Started - Arduino IoT Cloud -All Arduino® IoT enabled products are supported on Arduino® IoT Cloud which allows you to log, graph and analyze sensor data, trigger events, and automate your home or business. - -### Sample Sketches -Sample sketches for Arduino Opta® can be found either in the “Examples” menu in the Arduino® IDE or the “Arduino Opta® Documentation” section of Arduino® **[5]**. - -### Online Resources -Now that you have gone through the basics of what you can do with the device, you can explore the endless possibilities it provides by checking exciting projects on ProjectHub **[6]**, the Arduino® Library Reference **[7]** and the online store **[8]** where you will be able to complement your Arduino Opta® product with additional extensions, sensors and actuators. - - -## Mechanical Information -### Product Dimensions -![Arduino Opta® Outline. Dimensions are in mm](assets/opta_mechanical.svg) - -***Note: Terminals can be used with both solid and stranded core wire (min: 0.5 mm2 / 20 AWG).*** - - -## Certifications - -### Certifications Summary - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
CertArduino Opta® RS485 (AFX00001)Arduino Opta® WiFi (AFX00002)Arduino Opta® Lite (AFX00003)
CE (EU) -

EN IEC 61326-1:2021

-

EN IEC 61010 (LVD)

-
-

EN IEC 62311:2020

-

EN IEC 61010 (LVD)

-

EN 301 489-1 V2.2.3

-

EN 301 489-17 V3.2.4

-

IEC 61326-1:2021

-

EN 300 328 V2.2.2:2019-07

-
-

EN IEC 61326-1:2021

-

EN IEC 61010 (LVD)

-
CB (EU)YesYesYes
WEEE (EU)YesYesYes
ENEC -

Yes

-
-

Yes

-
-

Yes

-
REACH (EU)YesYesYes
UKCA (UK)EN IEC 61326-1:2021 -

EN IEC 62311:2020

-

EN 300 328 V2.2.2:2019-07

-

EN 301 489-1 V2.2.3

-

EN 301 489-17 V3.2.4

-

IEC 61326-1:2021

-

EN 300 328 V2.2.2:2019-07

-
EN IEC 61326-1:2021
FCC (US) -

Yes

-
-

Yes

-
-

Yes

-
cULus -

UL 61010-2-201

-
-

UL 61010-2-201

-
-

UL 61010-2-201

-
- -### Declaration of Conformity CE DoC (EU) -We declare under our sole responsibility that the products above are in conformity with the essential requirements of the following EU Directives and therefore qualify for free movement within markets comprising the European Union (EU) and European Economic Area (EEA). - -### Declaration of Conformity to EU RoHS & REACH 211 01/19/2021 - -Arduino boards are in compliance with RoHS 2 Directive 2011/65/EU of the European Parliament and RoHS 3 Directive 2015/863/EU of the Council of 4 June 2015 on the restriction of the use of certain hazardous substances in electrical and electronic equipment. - -| Substance | **Maximum limit (ppm)** | -|----------------------------------------|-------------------------| -| Lead (Pb) | 1000 | -| Cadmium (Cd) | 100 | -| Mercury (Hg) | 1000 | -| Hexavalent Chromium (Cr6+) | 1000 | -| Poly Brominated Biphenyls (PBB) | 1000 | -| Poly Brominated Diphenyl ethers (PBDE) | 1000 | -| Bis(2-Ethylhexyl} phthalate (DEHP) | 1000 | -| Benzyl butyl phthalate (BBP) | 1000 | -| Dibutyl phthalate (DBP) | 1000 | -| Diisobutyl phthalate (DIBP) | 1000 | - -Exemptions: No exemptions are claimed. - -Arduino Boards are fully compliant with the related requirements of European Union Regulation (EC) 1907 /2006 concerning the Registration, Evaluation, Authorization and Restriction of Chemicals (REACH). We declare none of the SVHCs (https://echa.europa.eu/web/guest/candidate-list-table), the Candidate List of Substances of Very High Concern for authorization currently released by ECHA, is present in all products (and also package) in quantities totaling in a concentration equal or above 0.1%. To the best of our knowledge, we also declare that our products do not contain any of the substances listed on the "Authorization List" (Annex XIV of the REACH regulations) and Substances of Very High Concern (SVHC) in any significant amounts as specified by the Annex XVII of Candidate list published by ECHA (European Chemical Agency) 1907 /2006/EC. - -### Conflict Minerals Declaration -As a global supplier of electronic and electrical components, Arduino is aware of our obligations with regards to laws and regulations regarding Conflict Minerals, specifically the Dodd-Frank Wall Street Reform and Consumer Protection Act, Section 1502. Arduino does not directly source or process conflict minerals such as Tin, Tantalum, Tungsten, or Gold. Conflict minerals are contained in our products in the form of solder, or as a component in metal alloys. As part of our reasonable due diligence Arduino has contacted component suppliers within our supply chain to verify their continued compliance with the regulations. Based on the information received thus far we declare that our products contain Conflict Minerals sourced from conflict-free areas. - -## FCC Caution -Any Changes or modifications not expressly approved by the party responsible for compliance could void the user’s authority to operate the equipment. - -This device complies with part 15 of the FCC Rules. Operation is subject to the following two conditions: - -(1) This device may not cause harmful interference - -(2) this device must accept any interference received, including interference that may cause undesired operation. - -**FCC RF Radiation Exposure Statement:** - -1. This Transmitter must not be co-located or operating in conjunction with any other antenna or transmitter. - -2. This equipment complies with RF radiation exposure limits set forth for an uncontrolled environment. - -3. This equipment should be installed and operated with a minimum distance of 20 cm between the radiator & your body. - -English: -User manuals for license-exempt radio apparatus shall contain the following or equivalent notice in a conspicuous location in the user manual or alternatively on the device or both. This device complies with Industry Canada licence-exempt RSS standard(s). Operation is subject to the following two conditions: - -(1) this device may not cause interference - -(2) this device must accept any interference, including interference that may cause undesired operation of the device. - -French: -Le présent appareil est conforme aux CNR d’Industrie Canada applicables aux appareils radio exempts de licence. L’exploitation est autorisée aux deux conditions suivantes: - -(1) l’ appareil nedoit pas produire de brouillage - -(2) l’utilisateur de l’appareil doit accepter tout brouillage radioélectrique subi, même si le brouillage est susceptible d’en compromettre le fonctionnement. - -**IC SAR Warning:** - -English: -This equipment should be installed and operated with a minimum distance of 20 cm between the radiator and your body. - -French: -Lors de l’ installation et de l’ exploitation de ce dispositif, la distance entre le radiateur et le corps est d ’au moins 20 cm. - -**Important:** The operating temperature of the EUT can’t exceed 85℃ and shouldn’t be lower than -40℃. - -Hereby, Arduino S.r.l. declares that this product is in compliance with essential requirements and other relevant provisions of Directive 2014/53/EU. This product is allowed to be used in all EU member states. - -## Company Information - -| Company name | Arduino SRL | -|-----------------|-------------------------------------------------| -| Company Address | Via Andrea Appiani, 25 - 20900 MONZA(Italy) | - - -## Reference Documentation -| **Ref** | **Link** | -|:---------------------------------:|---------------------------------------------------------------------------------------------| -| Arduino IDE (Desktop) | https://www.arduino.cc/en/Main/Software | -| Arduino IDE (Cloud) | https://create.arduino.cc/editor | -| Arduino Cloud - Getting started | https://docs.arduino.cc/arduino-cloud/getting-started/iot-cloud-getting-started | -| Arduino PLC IDE | https://www.arduino.cc/en/Main/Software | -| Arduino Opta® Documentation | https://docs.arduino.cc/hardware/opta | -| Project Hub | https://create.arduino.cc/projecthub?by=part&part_id=11332&sort=trending | -| Library Reference | https://www.arduino.cc/reference/en/ | -| Online Store | https://store.arduino.cc/ | - -## Revision History - -| Date | **Revision** | **Changes** | -|------------|--------------|---------------| -| 02/03/2023 | 1 | First Release | - +--- +identifier: AFX00001-AFX00002-AFX00003 +title: Arduino Opta® +type: pro +variant: 'Collective Datasheet' +author: Ali Jahangiri, Julián Caro Linares +--- +![](assets/featured.png) + +# Description +Arduino Opta® is a secure, easy-to-use micro PLC with Industrial IoT capabilities. Designed in partnership with leading relay manufacturer Finder®, it allows professionals to scale up industrial and building automation projects while taking advantage of the Arduino ecosystem. + +The Arduino Opta® family has three variants: the Arduino Opta® Lite, Arduino Opta® RS485, and Arduino Opta® WiFi, all of them documented inside this document. + + +# Target Areas: +Industrial IoT, Building automation, Electrical loads management, Industrial automation + + +# CONTENTS +## Product Variants +There are three variants of the Arduino Opta® created to fit the different needs of each industry and application. The difference between each of the variants can be found in the following table: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameArduino Opta® LiteArduino Opta® RS485Arduino Opta® WiFi
SKUAFX00003AFX00001AFX00002
USB +

USB-C®

+
+

USB-C®

+
+

USB-C®

+
Ethernet Support10/100BASE-T Port10/100BASE-T Port10/100BASE-T Port
RS-485N/AHalf-duplexHalf-duplex
Wi-Fi®N/AN/A802.11 b/g/n
Bluetooth®N/AN/ABluetooth® Low Energy
+ +## Application Examples +Arduino Opta® is designed for industrial standard machinery control as a PLC with advanced features such as AI and connectivity capabilities. It is readily integrated into the Arduino hardware and software ecosystem, including real-time monitoring via the Arduino IoT Cloud. + + +- **Conveyor belt management:** Arduino Opta® offers the possibility to configure its inputs as digital or analog to flexibly collect data from several types of sensors. Thanks to the Wi-Fi®/Bluetooth® Low Energy connectivity, Arduino Opta® can also be smoothly integrated with sensing boards, like the Nicla® ones from the Arduino ecosystem, leveraging Arduino Opta's potential with vision, sound, weight detection, air quality measurement and many other capabilities. + + Arduino Opta® can use the data from the various sensors as they are or, thanks to its powerful microcontroller, use the outcome from a computation, to operate a wide variety of industrial machinery through its high-performing relays. + + All these features, wrapped in a compact form factor, make Arduino Opta® the ideal solution for product flow management in conveyor belts, automated packing or bottling lines. + +- **Real-time industrial monitoring:** Get instant access to your factory floor data and to the insights of your industrial processes to leverage your manufacturing excellence to continuous improvement. Implement visual management and KPIs monitoring thanks to the Arduino Opta's built-in connectivity features (Ethernet on all the product variants, Fieldbus and WiFi®/Bluetooth® Low Energy upon choice), delivering in a simple, fast and reliable way the data collected through beautiful dashboards in Arduino IoT Cloud. + +- **Predictive **maintenance**:** Combine the possibility to interact with wireless and wired sensors, given by the multiple connectivity options of Arduino Opta®, with the powerful microcontroller computational capabilities to implement AI algorithms for predictive maintenance. Edge computing and monitoring capabilities, thanks to the Arduino IoT Cloud features, can help to identify small drifts in your processes to address issues before they become a problem, reducing production line downtimes and ensuring quality outcomes. + + +## Features +### General Specifications Overview + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
CharacteristicsDetails
Supply Voltage12...24 VDC
Inputs8x Analog/Digital inputs
Outputs4x Relays - Normally Open (NO) - Max: 10A each
ProcessorDual-core ST STM32H747XI Processor
Program Memory1 MB of RAM
Flash Memory2 MB
Flash QSPI Interface16 MB Flash QSPI. Shared between manufacturer's internal usage and data logging
Programming methodArduino + IEC-61131-3 (LD - SFC - FBD - ST - IL)
USB ConnectivityHost and Device operation, Programming/Flashing, Power delivery for programming (Not intended to drive external high-power peripherals)
CommunicationEthernet, RS-485 (AFX00001 & AFX00002), Wi-Fi® 2.4 GHz and Bluetooth® LE 4.2 supported by firmware, 5.1 supported by hardware (AFX00002)
SecurityATECC608B Crypto Microchip
Degree of ProtectionIP20
CertificationscULus, ENEC, FCC, CE, CB, UKCA
+ +### Processor + + + + + + + + + + + + + + + + + + + + + + + + +
ComponentDetails
ST STM32H747XI Processor

Dual-core

+

Arm® Cortex®-M7 core at up to 480 MHz + Arm® 32-bit Cortex®-M4 core at up to 240 MHz

+
Flash Memory +

2 MB of Flash Memory with read-while-write support

+
Programming Memory1 MB of RAM
+ +### Security + + + + + + + + + + + + + + + + + + + + + + + + + +
ComponentDetails
ATECC608B Crypto MicrochipCryptographic co-processor with secure hardware-based key storage
Protected storage for up to 16 Keys, certificates or data
Networking key management support
Secure boot support
Guaranteed unique 72-bit serial number
+ +### Communication + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
InterfacesTypeProtocols/Technologies supported
Ethernet10/100BASE-T PortTCP/IP, MODBUS TCP
RS-485Half-duplex without termination resistanceMODBUS RTU, Custom serial communication
Wireless connectivityWi-Fi®2.4 GHz
Wireless connectivityBluetooth® Low Energy4.2 supported by firmware, 5.1 supported by hardware
+ +### Inputs + + + + + + + + + + + + + + + + + + + + + + + + + +
CharacteristicsDetails
Number of inputs8x Analog/Digital inputs
Inputs overvoltage protectionyes
Antipolarity protectionyes
Input impedance8.9 kΩ
+ +#### Analog Inputs + + + + + + + + + + + + + + + + + + + + + + + + + +
CharacteristicsDetails
Analog Input voltage0...10V
Analog Input resolution12...16 bits - User configurable
Analog Input LSB value166 µV
Accuracy+/- 5%, repeatability +/- 2%
+ +#### Digital Inputs + + + + + + + + + + + + + + + + + + + + + + + + + +
CharacteristicsDetails
Digital Input voltage logic levelVIL Max: 4 VDC. VHL Min: 5.9 VDC
Digital Input current1.12mA at 10V
Digital Input frequency4.5 kHz
Cycle time for analog input acquisition10 µs
+ +### Outputs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
CharacteristicsDetails
Number of outputs4x relays (NO)
Max current per relay10A
Max peak current per relay15A
Continuous current per terminal10A
Short-circuit protectionNo, external fuse required
Relay rated voltage250 VAC
Relay Max voltage400 VAC
Rated load AC12500 VA
Rated load AC15 (230 VAC)500 VA
Breaking capacity DC1: 24/30/110/220V10/4/0.3/0.12A
Minimum switching load300mW (5V/5mA)
Max output line length (unshielded)100 m
Relay response time from state 0 to state 16 ms for relay output
Relay response time from state 1 to state 04 ms for relay output
Bounce time NO3 ms
Bounce time NC6 ms
Relay mechanical durability10 million cycles
Relay electrical durability10 thousand cycles with a resistive load of 10A
+ +
+ +## Ratings +### Recommended Operating Conditions + +| Description | Value | +|---------------------------------------------------|---------------------------| +| Temperature Operating Range | -20...50 °C | +| Protection degree rating | IP20 | +| Pollution degree | 2 conforming to IEC 61010 | + +### Power Specification + +| Property | Min | Typ | Max | Unit | +|----------------------- |------ |-----|------|------| +| Supply voltage | 12 | - | 24 | V | +| Permissible range | 10.2 | - | 27.6 | V | +| Power consumption (12V)| 0.6 | - | 2 | W | +| Power consumption (24V)| 0.6 | - | 2.2 | W | + +
+ +## Functional Overview +### Product View +![Arduino Opta® Product View](assets/opta_panel.svg) + +
+ +| Item | Feature | Item | Feature | +|------|---------------------------------------------------------------------|------|---------------------------------------------------------------------| +| 3A | Power Supply Terminals 12...24 VDC | 3H | Ethernet Port Status LEDs | +| 3B | I1...I8 digital/analog input terminals (0-10V) configurable via IDE | 3I | Label Holder | +| 3C | Reset Button | 3J | RS-485 terminal block (for Modbus RTU or proprietary communication) | +| 3D | User Programmable button | 3K | USB-C® for programming and data logging | +| 3E | Status LEDs 1...4 (User Programmable) | 3M | Ethernet port | +| 3F | Relay Output Terminals 1...4, NO contact (SPST) 10A 250 VAC | 3N | Port for communication and connection of auxiliary modules | +| 3G | Functional Earth | | | + +**Note:** The LED above the *User Programmable button* (Ref: 3D) is only available on Arduino Opta® WiFi (AFX00002). + +### Microcontroller +The microcontroller is a dual-core *STM32H747XI*. The main processor is a *Cortex M7* running at up to 480 MHz and the second one is a Cortex M4 running at up to 240 MHz. + +Arduino Opta® can be programmed using the libraries developed for it as part of the standard Arduino Core library. + +### Encryption +Encryption capabilities are provided by the *ATECC608B* chipset. This crypto-chip can be used to store sensitive information like security keys to connect to the Arduino® IoT Cloud or other third-party services, protecting Arduino Opta® from any unauthorized access in any kind of industrial and professional environment. + +### Ethernet +TCP/IP and Modbus TCP communication are supported. The 10/100 Ethernet physical interface is directly connected to the internal Ethernet MAC and provides full-duplex communication with automatic MDIX support. With an internet connection, Ethernet communication can be used to connect the device to the Arduino® IoT Cloud or other third-party services. + +### Modbus RTU +![Modbus RTU wiring diagram using the RS-485 interface](assets/opta_wiring_modbus.svg) + +Modbus RTU communication is supported using Arduino Opta's RS-485 physical interface. Note that **Arduino Opta® does not have internal terminator resistors** so they need to be added if necessary following the Modbus protocol specification. + +The wiring indication may vary depending on the connected device. In case the above connection indication is not resulting in consistent data transmission, invert the wires between A(-) and B(+) and retry. + +### Wi-Fi® and Bluetooth® Low Energy (AFX00002 Only) +The onboard wireless module allows simultaneous management of Wi-Fi® and Bluetooth® connectivity. The Wi-Fi® interface can be operated as an Access Point, as a Station or as a dual-mode simultaneous AP/STA, and can handle up to 65 Mbps transfer rate. Bluetooth® interface supports Bluetooth® Low Energy (4.2). + +With an internet connection, the Wi-Fi® communication can be used for connecting to the Arduino® IoT Cloud or other third-party services. + +### USB-C® +The USB-C® port can be used as a host or as a peripheral, but it cannot be used for both purposes at the same time. It is possible to use the connector to power the processor and flash it, but not to power the PLC outputs and peripherals. Additionally and using a USB memory stick, the USB-C® connector can be used for data logging purposes or to update the program inside the PLC. + +### Relay Outputs +Arduino Opta® has four *Normally Open* (NO) powerful 10A relays which are capable of actuating on loads at a rated voltage of 250 VAC and up to a maximum switching voltage of 400 VAC. + +The relay *Maximum Peak Current* is defined as the highest value of inrush current that the relay can endure without undergoing any permanent degradation of its characteristics due to the generated heat. The relay has to be able to hold up that maximum using a duty cycle of less or equal to 10% and for a time equal to or less than 0.5 s. + +In the case of Arduino Opta®, relays have a *Maximum Peak Current* of 15A. + +The *Rated Load* is the maximum resistive load that a contact can make, carry and break repeatedly. +- For resistive or slightly inductive loads (AC1 classification), Arduino Opta's *Rated Load* is 2500 VA. +- For small electromagnetic loads (> 72 VA) (AC15 classification) like power contactors, magnetic solenoid valves, electromagnets and AC single-phase supplies, Arduino Opta's *Rated Load* is 500 VA. This value assumes a peak inrush current of approximately 10 times the rated current and keeping it within the maximum peak current. + +For controlling DC loads (DC1 classification), the *Breaking Capacity* or maximum value of DC resistive current that a contact can make, carry and break repeatedly, is 10/4/0.3/0.12A for respectively 24/30/110/220V. + +In the case of the minimum switching load parameters, the minimum values of power, voltage and current that the relays can reliably switch, are 300 mW/ 5V / 5mA. This implies that with 5V the current must be at least 60mA, with 24V, it must be at least 12.5mA, and with 5mA the voltage must be at least 60V. + +The relays on Arduino Opta® provide a very fast response time of 6/4 ms to change state for closing/reopening, and a bounce time NO/NC of 3/6 ms. + +### Expansion Port +The expansion port can be used to expand the Arduino Opta® capabilities with the help of additional modules. Reserved for future functionality. + +### Programmable User Button +A pushbutton is accessible on the front panel of the Arduino Opta®. The functionality of this button can be configured via software. Note that the LED above the *User button* is only available on Arduino Opta® WiFi (AFX00002). + +### Functional Earth +To avoid and reduce electrical noise, Arduino Opta® has a *Functional Earth* connector (Ref: 3G) near the Ethernet connector. *Functional Earth*, not to be confused with *Ground*, helps the device to reduce electrical interferences in industrial environments, being crucial for having stable Fieldbus communications. + +## Device Operation +### Getting Started - IDE +If you want to program your Arduino Opta® while offline you need to install the Arduino® Desktop IDE **[1]**. To connect the Arduino Opta® to your computer, you will need a USB-C® cable. + +### Getting Started - Arduino Web Editor +All Arduino® devices work out-of-the-box on the Arduino® Web Editor **[2]** by just installing a simple plugin. + +The Arduino® Web Editor is hosted online, therefore it will always be up-to-date with the latest features and support for all boards and devices. Follow **[3]** to start coding on the browser and upload your sketches onto your device. + +### Getting Started - Arduino PLC IDE +Arduino Opta® can be also programmed using the industrial-standard **_IEC 61131-3_** programming languages. Download the Arduino® PLC IDE **[4]** software and connect your Arduino Opta® to your computer, using a simple USB-C® cable, to start creating your own PLC industrial solutions. + +### Getting Started - Arduino IoT Cloud +All Arduino® IoT enabled products are supported on Arduino® IoT Cloud which allows you to log, graph and analyze sensor data, trigger events, and automate your home or business. + +### Sample Sketches +Sample sketches for Arduino Opta® can be found either in the “Examples” menu in the Arduino® IDE or the “Arduino Opta® Documentation” section of Arduino® **[5]**. + +### Online Resources +Now that you have gone through the basics of what you can do with the device, you can explore the endless possibilities it provides by checking exciting projects on ProjectHub **[6]**, the Arduino® Library Reference **[7]** and the online store **[8]** where you will be able to complement your Arduino Opta® product with additional extensions, sensors and actuators. + + +## Mechanical Information +### Product Dimensions +![Arduino Opta® Outline. Dimensions are in mm](assets/opta_mechanical.svg) + +***Note: Terminals can be used with both solid and stranded core wire (min: 0.5 mm2 / 20 AWG).*** + + +## Certifications + +### Certifications Summary + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
CertArduino Opta® RS485 (AFX00001)Arduino Opta® WiFi (AFX00002)Arduino Opta® Lite (AFX00003)
CE (EU) +

EN IEC 61326-1:2021

+

EN IEC 61010 (LVD)

+
+

EN IEC 62311:2020

+

EN IEC 61010 (LVD)

+

EN 301 489-1 V2.2.3

+

EN 301 489-17 V3.2.4

+

IEC 61326-1:2021

+

EN 300 328 V2.2.2:2019-07

+
+

EN IEC 61326-1:2021

+

EN IEC 61010 (LVD)

+
CB (EU)YesYesYes
WEEE (EU)YesYesYes
ENEC +

Yes

+
+

Yes

+
+

Yes

+
REACH (EU)YesYesYes
UKCA (UK)EN IEC 61326-1:2021 +

EN IEC 62311:2020

+

EN 300 328 V2.2.2:2019-07

+

EN 301 489-1 V2.2.3

+

EN 301 489-17 V3.2.4

+

IEC 61326-1:2021

+

EN 300 328 V2.2.2:2019-07

+
EN IEC 61326-1:2021
FCC (US) +

Yes

+
+

Yes

+
+

Yes

+
cULus +

UL 61010-2-201

+
+

UL 61010-2-201

+
+

UL 61010-2-201

+
+ +### Declaration of Conformity CE DoC (EU) +We declare under our sole responsibility that the products above are in conformity with the essential requirements of the following EU Directives and therefore qualify for free movement within markets comprising the European Union (EU) and European Economic Area (EEA). + +### Declaration of Conformity to EU RoHS & REACH 211 01/19/2021 + +Arduino boards are in compliance with RoHS 2 Directive 2011/65/EU of the European Parliament and RoHS 3 Directive 2015/863/EU of the Council of 4 June 2015 on the restriction of the use of certain hazardous substances in electrical and electronic equipment. + +| Substance | **Maximum limit (ppm)** | +|----------------------------------------|-------------------------| +| Lead (Pb) | 1000 | +| Cadmium (Cd) | 100 | +| Mercury (Hg) | 1000 | +| Hexavalent Chromium (Cr6+) | 1000 | +| Poly Brominated Biphenyls (PBB) | 1000 | +| Poly Brominated Diphenyl ethers (PBDE) | 1000 | +| Bis(2-Ethylhexyl} phthalate (DEHP) | 1000 | +| Benzyl butyl phthalate (BBP) | 1000 | +| Dibutyl phthalate (DBP) | 1000 | +| Diisobutyl phthalate (DIBP) | 1000 | + +Exemptions: No exemptions are claimed. + +Arduino Boards are fully compliant with the related requirements of European Union Regulation (EC) 1907 /2006 concerning the Registration, Evaluation, Authorization and Restriction of Chemicals (REACH). We declare none of the SVHCs (https://echa.europa.eu/web/guest/candidate-list-table), the Candidate List of Substances of Very High Concern for authorization currently released by ECHA, is present in all products (and also package) in quantities totaling in a concentration equal or above 0.1%. To the best of our knowledge, we also declare that our products do not contain any of the substances listed on the "Authorization List" (Annex XIV of the REACH regulations) and Substances of Very High Concern (SVHC) in any significant amounts as specified by the Annex XVII of Candidate list published by ECHA (European Chemical Agency) 1907 /2006/EC. + +### Conflict Minerals Declaration +As a global supplier of electronic and electrical components, Arduino is aware of our obligations with regards to laws and regulations regarding Conflict Minerals, specifically the Dodd-Frank Wall Street Reform and Consumer Protection Act, Section 1502. Arduino does not directly source or process conflict minerals such as Tin, Tantalum, Tungsten, or Gold. Conflict minerals are contained in our products in the form of solder, or as a component in metal alloys. As part of our reasonable due diligence Arduino has contacted component suppliers within our supply chain to verify their continued compliance with the regulations. Based on the information received thus far we declare that our products contain Conflict Minerals sourced from conflict-free areas. + +## FCC Caution +Any Changes or modifications not expressly approved by the party responsible for compliance could void the user’s authority to operate the equipment. + +This device complies with part 15 of the FCC Rules. Operation is subject to the following two conditions: + +(1) This device may not cause harmful interference + +(2) this device must accept any interference received, including interference that may cause undesired operation. + +**FCC RF Radiation Exposure Statement:** + +1. This Transmitter must not be co-located or operating in conjunction with any other antenna or transmitter. + +2. This equipment complies with RF radiation exposure limits set forth for an uncontrolled environment. + +3. This equipment should be installed and operated with a minimum distance of 20 cm between the radiator & your body. + +English: +User manuals for license-exempt radio apparatus shall contain the following or equivalent notice in a conspicuous location in the user manual or alternatively on the device or both. This device complies with Industry Canada licence-exempt RSS standard(s). Operation is subject to the following two conditions: + +(1) this device may not cause interference + +(2) this device must accept any interference, including interference that may cause undesired operation of the device. + +French: +Le présent appareil est conforme aux CNR d’Industrie Canada applicables aux appareils radio exempts de licence. L’exploitation est autorisée aux deux conditions suivantes: + +(1) l’ appareil nedoit pas produire de brouillage + +(2) l’utilisateur de l’appareil doit accepter tout brouillage radioélectrique subi, même si le brouillage est susceptible d’en compromettre le fonctionnement. + +**IC SAR Warning:** + +English: +This equipment should be installed and operated with a minimum distance of 20 cm between the radiator and your body. + +French: +Lors de l’ installation et de l’ exploitation de ce dispositif, la distance entre le radiateur et le corps est d ’au moins 20 cm. + +**Important:** The operating temperature of the EUT can’t exceed 85℃ and shouldn’t be lower than -40℃. + +Hereby, Arduino S.r.l. declares that this product is in compliance with essential requirements and other relevant provisions of Directive 2014/53/EU. This product is allowed to be used in all EU member states. + +## Company Information + +| Company name | Arduino SRL | +|-----------------|-------------------------------------------------| +| Company Address | Via Andrea Appiani, 25 - 20900 MONZA(Italy) | + + +## Reference Documentation +| **Ref** | **Link** | +|:---------------------------------:|---------------------------------------------------------------------------------------------| +| Arduino IDE (Desktop) | https://www.arduino.cc/en/Main/Software | +| Arduino IDE (Cloud) | https://create.arduino.cc/editor | +| Arduino Cloud - Getting started | https://docs.arduino.cc/arduino-cloud/getting-started/iot-cloud-getting-started | +| Arduino PLC IDE | https://www.arduino.cc/en/Main/Software | +| Arduino Opta® Documentation | https://docs.arduino.cc/hardware/opta | +| Project Hub | https://create.arduino.cc/projecthub?by=part&part_id=11332&sort=trending | +| Library Reference | https://www.arduino.cc/reference/en/ | +| Online Store | https://store.arduino.cc/ | + +## Revision History + +| Date | **Revision** | **Changes** | +|------------|--------------|---------------| +| 02/03/2023 | 1 | First Release | + diff --git a/content/hardware/05.pro-solutions/solutions-and-kits/opta/features.md b/content/hardware/07.opta/opta-family/opta/features.md similarity index 100% rename from content/hardware/05.pro-solutions/solutions-and-kits/opta/features.md rename to content/hardware/07.opta/opta-family/opta/features.md diff --git a/content/hardware/05.pro-solutions/solutions-and-kits/opta/image.svg b/content/hardware/07.opta/opta-family/opta/image.svg similarity index 100% rename from content/hardware/05.pro-solutions/solutions-and-kits/opta/image.svg rename to content/hardware/07.opta/opta-family/opta/image.svg diff --git a/content/hardware/05.pro-solutions/solutions-and-kits/opta/product.md b/content/hardware/07.opta/opta-family/opta/product.md similarity index 100% rename from content/hardware/05.pro-solutions/solutions-and-kits/opta/product.md rename to content/hardware/07.opta/opta-family/opta/product.md diff --git a/content/hardware/05.pro-solutions/solutions-and-kits/opta/tech-specs.md b/content/hardware/07.opta/opta-family/opta/tech-specs.md similarity index 100% rename from content/hardware/05.pro-solutions/solutions-and-kits/opta/tech-specs.md rename to content/hardware/07.opta/opta-family/opta/tech-specs.md diff --git a/content/hardware/05.pro-solutions/solutions-and-kits/opta/tech-specs.yml b/content/hardware/07.opta/opta-family/opta/tech-specs.yml similarity index 100% rename from content/hardware/05.pro-solutions/solutions-and-kits/opta/tech-specs.yml rename to content/hardware/07.opta/opta-family/opta/tech-specs.yml diff --git a/content/hardware/05.pro-solutions/solutions-and-kits/opta/tutorials/getting-started-connectivity/assets/opta-ble.svg b/content/hardware/07.opta/opta-family/opta/tutorials/getting-started-connectivity/assets/opta-ble.svg similarity index 100% rename from content/hardware/05.pro-solutions/solutions-and-kits/opta/tutorials/getting-started-connectivity/assets/opta-ble.svg rename to content/hardware/07.opta/opta-family/opta/tutorials/getting-started-connectivity/assets/opta-ble.svg diff --git a/content/hardware/05.pro-solutions/solutions-and-kits/opta/tutorials/getting-started-connectivity/assets/opta-ethernet.svg b/content/hardware/07.opta/opta-family/opta/tutorials/getting-started-connectivity/assets/opta-ethernet.svg similarity index 100% rename from content/hardware/05.pro-solutions/solutions-and-kits/opta/tutorials/getting-started-connectivity/assets/opta-ethernet.svg rename to content/hardware/07.opta/opta-family/opta/tutorials/getting-started-connectivity/assets/opta-ethernet.svg diff --git a/content/hardware/05.pro-solutions/solutions-and-kits/opta/tutorials/getting-started-connectivity/assets/opta-wifi.svg b/content/hardware/07.opta/opta-family/opta/tutorials/getting-started-connectivity/assets/opta-wifi.svg similarity index 100% rename from content/hardware/05.pro-solutions/solutions-and-kits/opta/tutorials/getting-started-connectivity/assets/opta-wifi.svg rename to content/hardware/07.opta/opta-family/opta/tutorials/getting-started-connectivity/assets/opta-wifi.svg diff --git a/content/hardware/05.pro-solutions/solutions-and-kits/opta/tutorials/getting-started-connectivity/content.md b/content/hardware/07.opta/opta-family/opta/tutorials/getting-started-connectivity/content.md similarity index 100% rename from content/hardware/05.pro-solutions/solutions-and-kits/opta/tutorials/getting-started-connectivity/content.md rename to content/hardware/07.opta/opta-family/opta/tutorials/getting-started-connectivity/content.md diff --git a/content/hardware/05.pro-solutions/solutions-and-kits/opta/tutorials/getting-started-with-modbus-rtu/assets/Opta_Modbus_RTU_Example.zip b/content/hardware/07.opta/opta-family/opta/tutorials/getting-started-with-modbus-rtu/assets/Opta_Modbus_RTU_Example.zip similarity index 100% rename from content/hardware/05.pro-solutions/solutions-and-kits/opta/tutorials/getting-started-with-modbus-rtu/assets/Opta_Modbus_RTU_Example.zip rename to content/hardware/07.opta/opta-family/opta/tutorials/getting-started-with-modbus-rtu/assets/Opta_Modbus_RTU_Example.zip diff --git a/content/hardware/05.pro-solutions/solutions-and-kits/opta/tutorials/getting-started-with-modbus-rtu/assets/opta-modbus-client.svg b/content/hardware/07.opta/opta-family/opta/tutorials/getting-started-with-modbus-rtu/assets/opta-modbus-client.svg similarity index 100% rename from content/hardware/05.pro-solutions/solutions-and-kits/opta/tutorials/getting-started-with-modbus-rtu/assets/opta-modbus-client.svg rename to content/hardware/07.opta/opta-family/opta/tutorials/getting-started-with-modbus-rtu/assets/opta-modbus-client.svg diff --git a/content/hardware/05.pro-solutions/solutions-and-kits/opta/tutorials/getting-started-with-modbus-rtu/assets/opta-modbus-connection.svg b/content/hardware/07.opta/opta-family/opta/tutorials/getting-started-with-modbus-rtu/assets/opta-modbus-connection.svg similarity index 100% rename from content/hardware/05.pro-solutions/solutions-and-kits/opta/tutorials/getting-started-with-modbus-rtu/assets/opta-modbus-connection.svg rename to content/hardware/07.opta/opta-family/opta/tutorials/getting-started-with-modbus-rtu/assets/opta-modbus-connection.svg diff --git a/content/hardware/05.pro-solutions/solutions-and-kits/opta/tutorials/getting-started-with-modbus-rtu/content.md b/content/hardware/07.opta/opta-family/opta/tutorials/getting-started-with-modbus-rtu/content.md similarity index 97% rename from content/hardware/05.pro-solutions/solutions-and-kits/opta/tutorials/getting-started-with-modbus-rtu/content.md rename to content/hardware/07.opta/opta-family/opta/tutorials/getting-started-with-modbus-rtu/content.md index 7a94a3e395..b325f845c4 100644 --- a/content/hardware/05.pro-solutions/solutions-and-kits/opta/tutorials/getting-started-with-modbus-rtu/content.md +++ b/content/hardware/07.opta/opta-family/opta/tutorials/getting-started-with-modbus-rtu/content.md @@ -1,504 +1,504 @@ ---- -title: 'Getting Started with Modbus RTU on Opta™' -description: "Learn how to use the Modbus RTU serial protocol on Opta™." -author: 'José Bagur and Taddy Chung' -libraries: - - name: 'ArduinoRS485' - url: https://www.arduino.cc/reference/en/libraries/arduinors485 - - name: 'ArduinoModbus' - url: https://www.arduino.cc/reference/en/libraries/arduinomodbus -difficulty: intermediate -tags: - - Getting-started - - ModbusRTU - - RS-485 -software: - - ide-v1 - - ide-v2 - - arduino-cli - - web-editor -hardware: - - hardware/05.pro-solutions/solutions-and-kits/opta ---- - -## Overview - -The **Opta™**, with its industrial hardware and software capabilities, and the Arduino ecosystem tools such as the Arduino IDE and its libraries, provide several types of Modbus communication protocol with effortless implementation thanks to its robust design. - -The Modbus RTU protocol is one of the protocols available within Opta™. In this tutorial, we will learn how to implement Modbus RTU communications protocol over RS-485 between two Opta™ devices. - -## Goals - -- Learn how to establish RS-485 interface connection between two Opta™ devices -- Learn how to use the Modbus RTU communication protocol between two Opta™ devices - -## Required Hardware and Software - -### Hardware Requirements - -- Opta™ PLC with RS-485 support (x2) -- 12VDC/1A DIN rail power supply (x1) -- USB-C® cable (x1) -- Wire with either specification for RS-485 connection (x3): -- STP/UTP 24-18AWG (Unterminated) 100-130Ω rated -- STP/UTP 22-16AWG (Terminated) 100-130Ω rated - -### Software Requirements - -- [Arduino IDE 1.8.10+](https://www.arduino.cc/en/software), [Arduino IDE 2.0+](https://www.arduino.cc/en/software), or [Arduino Web Editor](https://create.arduino.cc/editor) -- If you choose an offline Arduino IDE, you must install the following libraries: `ArduinoRS485`, and `ArduinoModbus`. You can install these libraries via Library Manager of the Arduino IDE. -- [Modbus RTU example code](assets/Opta_Modbus_RTU_Example.zip) - -## Modbus Protocol - -Modbus is an open and royalty-free serial communication protocol derived from the client/server architecture. It is widely used in industrial electronic devices, especially in Building Management Systems (BMS) and Industrial Automation Systems (IAS). - -It was published by Modicon (now Schneider Electric) in 1979 and has become a _de facto_ standard communication protocol among industrial electronic devices to be used with programmable logic controllers (PLCs). - -Modbus communication protocol is often used to connect a supervisory device with a Remote Terminal Unit (RTU) in Supervisory Control and Data Acquisition (SCADA) systems. Reliability in communications between electronic devices is ensured with Modbus by using messages with a simple 16-bit structure with a Cyclic-Redundant Checksum (CRC). - -If you want more insights on the Modbus communication protocol, take a look at [Modbus article](https://docs.arduino.cc/learn/communication/modbus) complying as well with Opta™. - -## Instructions - -### Setting Up the Arduino IDE - -If you haven't already, head over [here](https://www.arduino.cc/en/software) and install the most recent version of the Arduino IDE along with the necessary device drivers for your computer. For additional details on Opta™, check out [getting started tutorial](/tutorials/opta/getting-started). Make sure you install the latest version of the [ArduinoModbus](https://www.arduino.cc/reference/en/libraries/arduinomodbus/) and the [ArduinoRS485](https://www.arduino.cc/reference/en/libraries/arduinors485/) libraries, as they will be used to implement the Modbus RTU communication protocol. - -### Connecting the Opta™ Over RS-485 - -It requires setting up an RS-485 connection to enable the Modbus RTU communication protocol. Refer to the following diagram for connecting two Opta™ devices via the RS-485 interface. - -![Connecting two Opta™ devices via RS-485](assets/opta-modbus-connection.svg) - -### Code Overview - -The goal of the following example is to configure and use the Modbus RTU communication protocol over the RS-485 interface between two Opta™ devices. - -The Modbus is a renowned Client-Server protocol for its reliability. The Modbus Client is responsible as a requesting device, and the Modbus Server provides requested information when available. Several Modbus Servers are allowed, but only one Modbus Client can be present. In this example, an Opta™ Client handles writing and reading `Coil`, `Holding`, `Discrete Input`, and `Input` register values, while an Opta™ Server will poll for Modbus RTU requests and return the appropriate values. - -The crucial components of the code used in this tutorial are discussed in detail in the following sections to make the example easier to understand. - -You can access the complete example code [here](assets/Opta_Modbus_RTU_Example.zip); after extracting the files, `Opta_ModbusRTU_client` and `Opta_ModbusRTU_server` sketches are available to try with your Opta™ devices. - -#### Modbus RTU Client - -The Opta™ Client will require the following setup: - -```arduino -#include -#include // ArduinoModbus depends on the ArduinoRS485 library - -constexpr auto baudrate { 19200 }; - -// Calculate preDelay and postDelay in microseconds as per Modbus RTU Specification -// MODBUS over serial line specification and implementation guide V1.02 -// Paragraph 2.5.1.1 MODBUS Message RTU Framing -// https://modbus.org/docs/Modbus_over_serial_line_V1_02.pdf -constexpr auto bitduration { 1.f / baudrate }; -constexpr auto preDelayBR { bitduration * 9.6f * 3.5f * 1e6 }; -constexpr auto postDelayBR { bitduration * 9.6f * 3.5f * 1e6 }; -// constexpr auto preDelayBR { bitduration * 10.0f * 3.5f * 1e6 }; - -int counter = 0; - -void setup() { - Serial.begin(9600); - while (!Serial); - - Serial.println("Modbus RTU Client"); - - RS485.setDelays(preDelayBR, postDelayBR); - - // Start the Modbus RTU client - if (!ModbusRTUClient.begin(baudrate, SERIAL_8E1)) { - Serial.println("Failed to start Modbus RTU Client!"); - while (1); - } -} -``` - -The `preDelay` and `postDelay` parameters are configured for a proper operation per Modbus RTU specification. The method `RS485.setDelays(preDelayBR, postDelayBR)` is then called to correctly set and use Modbus RTU over RS-485 interface on Opta™. In this example, such parameters are applied based on the message RTU framing specifications explained in depth in this [guide](https://modbus.org/docs/Modbus_over_serial_line_V1_02.pdf). - -The typical baud rates are usually `9600` and `19200`; in the current example, we are using a baud rate of `19200`, but it can be changed depending on the system requirements. For the serial port parameter, `SERIAL_8E1` is used to set 8 data bits, even parity, and one stop bit. - -The Modbus Server can be a module or a sensor with registers that can be accessed using specified addresses to obtain the monitored information or measurements. Inside the loop function of the sketch for the Client device, there are several tasks in charge of reading and writing specific values to access these types of data. Such data are `Coil`, `Holding`, `Discrete Input`, and `Input` register values. - -```arduino -void loop() { - writeCoilValues(); - - readCoilValues(); - - readDiscreteInputValues(); - - writeHoldingRegisterValues(); - - readHoldingRegisterValues(); - - readInputRegisterValues(); - - counter++; - - delay(5000); - Serial.println(); -} -``` - -The complete code for the Client is shown below: - -```arduino -/** - Getting Started with Modbus RTU on Opta™ - Name: Opta_Client - Purpose: Writes Coil and Holding Register values; Reads Coil, Discrete Input, Holding Registers, and Input Register values. - - @author Arduino -*/ - -#include -#include // ArduinoModbus depends on the ArduinoRS485 library - -constexpr auto baudrate { 19200 }; - -// Calculate preDelay and postDelay in microseconds as per Modbus RTU Specification -// MODBUS over serial line specification and implementation guide V1.02 -// Paragraph 2.5.1.1 MODBUS Message RTU Framing -// https://modbus.org/docs/Modbus_over_serial_line_V1_02.pdf -constexpr auto bitduration { 1.f / baudrate }; -constexpr auto preDelayBR { bitduration * 9.6f * 3.5f * 1e6 }; -constexpr auto postDelayBR { bitduration * 9.6f * 3.5f * 1e6 }; -// constexpr auto preDelayBR { bitduration * 10.0f * 3.5f * 1e6 }; - -int counter = 0; - -void setup() { - Serial.begin(9600); - while (!Serial); - - Serial.println("Modbus RTU Client"); - - RS485.setDelays(preDelayBR, postDelayBR); - - // Start the Modbus RTU client - if (!ModbusRTUClient.begin(baudrate, SERIAL_8E1)) { - Serial.println("Failed to start Modbus RTU Client!"); - while (1); - } -} - -void loop() { - writeCoilValues(); - - readCoilValues(); - - readDiscreteInputValues(); - - writeHoldingRegisterValues(); - - readHoldingRegisterValues(); - - readInputRegisterValues(); - - counter++; - - delay(5000); - Serial.println(); -} - -/** - Writes Coil values to the server under specified address. -*/ -void writeCoilValues() { - // Set the coils to 1 when counter is odd - byte coilValue = ((counter % 2) == 0) ? 0x00 : 0x01; - - Serial.print("Writing Coil values ... "); - - // Srite 10 Coil values to (server) id 42, address 0x00 - ModbusRTUClient.beginTransmission(42, COILS, 0x00, 10); - for (int i = 0; i < 10; i++) { - ModbusRTUClient.write(coilValue); - } - if (!ModbusRTUClient.endTransmission()) { - Serial.print("failed! "); - Serial.println(ModbusRTUClient.lastError()); - } else { - Serial.println("success"); - } - - // Alternatively, to write a single Coil value use: - // ModbusRTUClient.coilWrite(...) -} - -/** - Reads Coil values from the server under specified address. -*/ -void readCoilValues() { - Serial.print("Reading Coil values ... "); - - // Read 10 Coil values from (server) id 42, address 0x00 - if (!ModbusRTUClient.requestFrom(42, COILS, 0x00, 10)) { - Serial.print("failed! "); - Serial.println(ModbusRTUClient.lastError()); - } else { - Serial.println("success"); - - while (ModbusRTUClient.available()) { - Serial.print(ModbusRTUClient.read()); - Serial.print(' '); - } - Serial.println(); - } - - // Alternatively, to read a single Coil value use: - // ModbusRTUClient.coilRead(...) -} - -/** - Reads Discrete Input values from the server under specified address. -*/ -void readDiscreteInputValues() { - Serial.print("Reading Discrete Input values ... "); - - // Read 10 Discrete Input values from (server) id 42, address 0x00 - if (!ModbusRTUClient.requestFrom(42, DISCRETE_INPUTS, 0x00, 10)) { - Serial.print("failed! "); - Serial.println(ModbusRTUClient.lastError()); - } else { - Serial.println("success"); - - while (ModbusRTUClient.available()) { - Serial.print(ModbusRTUClient.read()); - Serial.print(' '); - } - Serial.println(); - } - - // Alternatively, to read a single Discrete Input value use: - // ModbusRTUClient.discreteInputRead(...) -} - -/** - Writes Holding Register values to the server under specified address. -*/ -void writeHoldingRegisterValues() { - //Set the Holding Register values to counter - Serial.print("Writing Holding Registers values ... "); - - // Write 10 coil values to (server) id 42, address 0x00 - ModbusRTUClient.beginTransmission(42, HOLDING_REGISTERS, 0x00, 10); - for (int i = 0; i < 10; i++) { - ModbusRTUClient.write(counter); - } - if (!ModbusRTUClient.endTransmission()) { - Serial.print("failed! "); - Serial.println(ModbusRTUClient.lastError()); - } else { - Serial.println("success"); - } - - // Alternatively, to write a single Holding Register value use: - // ModbusRTUClient.holdingRegisterWrite(...) -} - -/** - Reads Holding Register values from the server under specified address. -*/ -void readHoldingRegisterValues() { - Serial.print("Reading Holding Register values ... "); - - // Read 10 Input Register values from (server) id 42, address 0x00 - if (!ModbusRTUClient.requestFrom(42, HOLDING_REGISTERS, 0x00, 10)) { - Serial.print("failed! "); - Serial.println(ModbusRTUClient.lastError()); - } else { - Serial.println("success"); - - while (ModbusRTUClient.available()) { - Serial.print(ModbusRTUClient.read()); - Serial.print(' '); - } - Serial.println(); - } - - // Alternatively, to read a single Holding Register value use: - // ModbusRTUClient.holdingRegisterRead(...) -} - -/** - Reads Input Register values from the server under specified address. -*/ -void readInputRegisterValues() { - Serial.print("Reading input register values ... "); - - // Read 10 discrete input values from (server) id 42, - if (!ModbusRTUClient.requestFrom(42, INPUT_REGISTERS, 0x00, 10)) { - Serial.print("failed! "); - Serial.println(ModbusRTUClient.lastError()); - } else { - Serial.println("success"); - - while (ModbusRTUClient.available()) { - Serial.print(ModbusRTUClient.read()); - Serial.print(' '); - } - Serial.println(); - } - - // Alternatively, to read a single Input Register value use: - // ModbusRTUClient.inputRegisterRead(...) -} -``` - -#### Modbus RTU Server - -In the Opta™ Server, the main task will be to poll for Modbus RTU requests and return configured values when requested. It requires following the same initial configuration as the Opta™ Client. The main difference between the Client and the Server devices lies in the `setup()` function: - -```arduino -#include // ArduinoModbus depends on the ArduinoRS485 library -#include - -constexpr auto baudrate { 19200 }; - -// Calculate preDelay and postDelay in microseconds as per Modbus RTU Specification -// MODBUS over serial line specification and implementation guide V1.02 -// Paragraph 2.5.1.1 MODBUS Message RTU Framing -// https://modbus.org/docs/Modbus_over_serial_line_V1_02.pdf -constexpr auto bitduration { 1.f / baudrate }; -constexpr auto preDelayBR { bitduration * 9.6f * 3.5f * 1e6 }; -constexpr auto postDelayBR { bitduration * 9.6f * 3.5f * 1e6 }; -// constexpr auto preDelayBR { bitduration * 10.0f * 3.5f * 1e6 }; - -const int numCoils = 10; -const int numDiscreteInputs = 10; -const int numHoldingRegisters = 10; -const int numInputRegisters = 10; - -void setup() { - Serial.begin(9600); - while (!Serial); - - Serial.println("Modbus RTU Server"); - - RS485.setDelays(preDelayBR, postDelayBR); - - // Start the Modbus RTU client - if (!ModbusRTUServer.begin(42, baudrate, SERIAL_8E1)) { - Serial.println("Failed to start Modbus RTU Server!"); - - while (1); - } - - // Configure coils at address 0x00 - ModbusRTUServer.configureCoils(0x00, numCoils); - - // Configure discrete inputs at address 0x00 - ModbusRTUServer.configureDiscreteInputs(0x00, numDiscreteInputs); - - // Configure holding registers at address 0x00 - ModbusRTUServer.configureHoldingRegisters(0x00, numHoldingRegisters); - - // Configure input registers at address 0x00 - ModbusRTUServer.configureInputRegisters(0x00, numInputRegisters); -} -``` - -In the `setup()` function of the sketch dedicated to the Modbus server, the Server address is assigned with an identifier that will be recognized by the Client. Also, the initial values of the `Coils`, `Discrete Input`, `Holding`, and `Input` registers are configured. These are the data that the Client will locate and retrieve. The following method is necessary in the Server `loop()` function: - -```arduino -ModbusRTUServer.poll(); -``` - -This is the method that polls for Modbus RTU requests. The complete code for the Server is shown below: - -```arduino -/** - Getting Started with Modbus RTU on Opta™ - Name: Opta_Server - Purpose: Configures Coils, Discrete Inputs, Holding and Input Registers; Polls for Modbus RTU requests and maps the coil values to the Discrete Input values, and Holding Registers to the Input Register values. - - @author Arduino -*/ - -#include // ArduinoModbus depends on the ArduinoRS485 library -#include - -constexpr auto baudrate { 19200 }; - -// Calculate preDelay and postDelay in microseconds as per Modbus RTU Specification -// MODBUS over serial line specification and implementation guide V1.02 -// Paragraph 2.5.1.1 MODBUS Message RTU Framing -// https://modbus.org/docs/Modbus_over_serial_line_V1_02.pdf -constexpr auto bitduration { 1.f / baudrate }; -constexpr auto preDelayBR { bitduration * 9.6f * 3.5f * 1e6 }; -constexpr auto postDelayBR { bitduration * 9.6f * 3.5f * 1e6 }; -// constexpr auto preDelayBR { bitduration * 10.0f * 3.5f * 1e6 }; - -const int numCoils = 10; -const int numDiscreteInputs = 10; -const int numHoldingRegisters = 10; -const int numInputRegisters = 10; - -void setup() { - Serial.begin(9600); - while (!Serial); - - Serial.println("Modbus RTU Server"); - - RS485.setDelays(preDelayBR, postDelayBR); - - // Start the Modbus RTU client - if (!ModbusRTUServer.begin(42, baudrate, SERIAL_8E1)) { - Serial.println("Failed to start Modbus RTU Client!"); - while (1); - } - - // Configure coils at address 0x00 - ModbusRTUServer.configureCoils(0x00, numCoils); - - // Configure discrete inputs at address 0x00 - ModbusRTUServer.configureDiscreteInputs(0x00, numDiscreteInputs); - - // Configure holding registers at address 0x00 - ModbusRTUServer.configureHoldingRegisters(0x00, numHoldingRegisters); - - // Configure input registers at address 0x00 - ModbusRTUServer.configureInputRegisters(0x00, numInputRegisters); -} - -void loop() { - // Poll for Modbus RTU requests - ModbusRTUServer.poll(); - - // Map the coil values to the discrete input values - for (int i = 0; i < numCoils; i++) { - int coilValue = ModbusRTUServer.coilRead(i); - - ModbusRTUServer.discreteInputWrite(i, coilValue); - } - - // Map the holding register values to the input register values - for (int i = 0; i < numHoldingRegisters; i++) { - long holdingRegisterValue = ModbusRTUServer.holdingRegisterRead(i); - - ModbusRTUServer.inputRegisterWrite(i, holdingRegisterValue); - } -} -``` - -### Testing the Modbus RTU Client and Server - -Once the Modbus RTU Client and Server code for each Opta™ device has been uploaded, a `Success!` message will be displayed on the Serial Monitor of Opta™ Client after each read-and-write task: - -![Modbus RTU Client and Server communication status](assets/opta-modbus-client.svg) - -## Conclusion - -This tutorial demonstrates how to use the Arduino ecosystem's `ArduinoRS485` and `ArduinoModbus` libraries, as well as the Arduino IDE, to implement the Modbus RTU protocol between two Opta™ devices. These are necessary elements to enable connection with Modbus RTU compliant devices. - -With the help of these examples, it is easy to understand how to enable Modbus RTU communication between a Server and a Client. For further project developments, it offers a scalable architecture to link additional Modbus Server devices, such as secondary Opta™ or a Modbus RTU-compatible module. - -### Next Steps - +--- +title: 'Getting Started with Modbus RTU on Opta™' +description: "Learn how to use the Modbus RTU serial protocol on Opta™." +author: 'José Bagur and Taddy Chung' +libraries: + - name: 'ArduinoRS485' + url: https://www.arduino.cc/reference/en/libraries/arduinors485 + - name: 'ArduinoModbus' + url: https://www.arduino.cc/reference/en/libraries/arduinomodbus +difficulty: intermediate +tags: + - Getting-started + - ModbusRTU + - RS-485 +software: + - ide-v1 + - ide-v2 + - arduino-cli + - web-editor +hardware: + - hardware/05.pro-solutions/solutions-and-kits/opta +--- + +## Overview + +The **Opta™**, with its industrial hardware and software capabilities, and the Arduino ecosystem tools such as the Arduino IDE and its libraries, provide several types of Modbus communication protocol with effortless implementation thanks to its robust design. + +The Modbus RTU protocol is one of the protocols available within Opta™. In this tutorial, we will learn how to implement Modbus RTU communications protocol over RS-485 between two Opta™ devices. + +## Goals + +- Learn how to establish RS-485 interface connection between two Opta™ devices +- Learn how to use the Modbus RTU communication protocol between two Opta™ devices + +## Required Hardware and Software + +### Hardware Requirements + +- Opta™ PLC with RS-485 support (x2) +- 12VDC/1A DIN rail power supply (x1) +- USB-C® cable (x1) +- Wire with either specification for RS-485 connection (x3): +- STP/UTP 24-18AWG (Unterminated) 100-130Ω rated +- STP/UTP 22-16AWG (Terminated) 100-130Ω rated + +### Software Requirements + +- [Arduino IDE 1.8.10+](https://www.arduino.cc/en/software), [Arduino IDE 2.0+](https://www.arduino.cc/en/software), or [Arduino Web Editor](https://create.arduino.cc/editor) +- If you choose an offline Arduino IDE, you must install the following libraries: `ArduinoRS485`, and `ArduinoModbus`. You can install these libraries via Library Manager of the Arduino IDE. +- [Modbus RTU example code](assets/Opta_Modbus_RTU_Example.zip) + +## Modbus Protocol + +Modbus is an open and royalty-free serial communication protocol derived from the client/server architecture. It is widely used in industrial electronic devices, especially in Building Management Systems (BMS) and Industrial Automation Systems (IAS). + +It was published by Modicon (now Schneider Electric) in 1979 and has become a _de facto_ standard communication protocol among industrial electronic devices to be used with programmable logic controllers (PLCs). + +Modbus communication protocol is often used to connect a supervisory device with a Remote Terminal Unit (RTU) in Supervisory Control and Data Acquisition (SCADA) systems. Reliability in communications between electronic devices is ensured with Modbus by using messages with a simple 16-bit structure with a Cyclic-Redundant Checksum (CRC). + +If you want more insights on the Modbus communication protocol, take a look at [Modbus article](https://docs.arduino.cc/learn/communication/modbus) complying as well with Opta™. + +## Instructions + +### Setting Up the Arduino IDE + +If you haven't already, head over [here](https://www.arduino.cc/en/software) and install the most recent version of the Arduino IDE along with the necessary device drivers for your computer. For additional details on Opta™, check out [getting started tutorial](/tutorials/opta/getting-started). Make sure you install the latest version of the [ArduinoModbus](https://www.arduino.cc/reference/en/libraries/arduinomodbus/) and the [ArduinoRS485](https://www.arduino.cc/reference/en/libraries/arduinors485/) libraries, as they will be used to implement the Modbus RTU communication protocol. + +### Connecting the Opta™ Over RS-485 + +It requires setting up an RS-485 connection to enable the Modbus RTU communication protocol. Refer to the following diagram for connecting two Opta™ devices via the RS-485 interface. + +![Connecting two Opta™ devices via RS-485](assets/opta-modbus-connection.svg) + +### Code Overview + +The goal of the following example is to configure and use the Modbus RTU communication protocol over the RS-485 interface between two Opta™ devices. + +The Modbus is a renowned Client-Server protocol for its reliability. The Modbus Client is responsible as a requesting device, and the Modbus Server provides requested information when available. Several Modbus Servers are allowed, but only one Modbus Client can be present. In this example, an Opta™ Client handles writing and reading `Coil`, `Holding`, `Discrete Input`, and `Input` register values, while an Opta™ Server will poll for Modbus RTU requests and return the appropriate values. + +The crucial components of the code used in this tutorial are discussed in detail in the following sections to make the example easier to understand. + +You can access the complete example code [here](assets/Opta_Modbus_RTU_Example.zip); after extracting the files, `Opta_ModbusRTU_client` and `Opta_ModbusRTU_server` sketches are available to try with your Opta™ devices. + +#### Modbus RTU Client + +The Opta™ Client will require the following setup: + +```arduino +#include +#include // ArduinoModbus depends on the ArduinoRS485 library + +constexpr auto baudrate { 19200 }; + +// Calculate preDelay and postDelay in microseconds as per Modbus RTU Specification +// MODBUS over serial line specification and implementation guide V1.02 +// Paragraph 2.5.1.1 MODBUS Message RTU Framing +// https://modbus.org/docs/Modbus_over_serial_line_V1_02.pdf +constexpr auto bitduration { 1.f / baudrate }; +constexpr auto preDelayBR { bitduration * 9.6f * 3.5f * 1e6 }; +constexpr auto postDelayBR { bitduration * 9.6f * 3.5f * 1e6 }; +// constexpr auto preDelayBR { bitduration * 10.0f * 3.5f * 1e6 }; + +int counter = 0; + +void setup() { + Serial.begin(9600); + while (!Serial); + + Serial.println("Modbus RTU Client"); + + RS485.setDelays(preDelayBR, postDelayBR); + + // Start the Modbus RTU client + if (!ModbusRTUClient.begin(baudrate, SERIAL_8E1)) { + Serial.println("Failed to start Modbus RTU Client!"); + while (1); + } +} +``` + +The `preDelay` and `postDelay` parameters are configured for a proper operation per Modbus RTU specification. The method `RS485.setDelays(preDelayBR, postDelayBR)` is then called to correctly set and use Modbus RTU over RS-485 interface on Opta™. In this example, such parameters are applied based on the message RTU framing specifications explained in depth in this [guide](https://modbus.org/docs/Modbus_over_serial_line_V1_02.pdf). + +The typical baud rates are usually `9600` and `19200`; in the current example, we are using a baud rate of `19200`, but it can be changed depending on the system requirements. For the serial port parameter, `SERIAL_8E1` is used to set 8 data bits, even parity, and one stop bit. + +The Modbus Server can be a module or a sensor with registers that can be accessed using specified addresses to obtain the monitored information or measurements. Inside the loop function of the sketch for the Client device, there are several tasks in charge of reading and writing specific values to access these types of data. Such data are `Coil`, `Holding`, `Discrete Input`, and `Input` register values. + +```arduino +void loop() { + writeCoilValues(); + + readCoilValues(); + + readDiscreteInputValues(); + + writeHoldingRegisterValues(); + + readHoldingRegisterValues(); + + readInputRegisterValues(); + + counter++; + + delay(5000); + Serial.println(); +} +``` + +The complete code for the Client is shown below: + +```arduino +/** + Getting Started with Modbus RTU on Opta™ + Name: Opta_Client + Purpose: Writes Coil and Holding Register values; Reads Coil, Discrete Input, Holding Registers, and Input Register values. + + @author Arduino +*/ + +#include +#include // ArduinoModbus depends on the ArduinoRS485 library + +constexpr auto baudrate { 19200 }; + +// Calculate preDelay and postDelay in microseconds as per Modbus RTU Specification +// MODBUS over serial line specification and implementation guide V1.02 +// Paragraph 2.5.1.1 MODBUS Message RTU Framing +// https://modbus.org/docs/Modbus_over_serial_line_V1_02.pdf +constexpr auto bitduration { 1.f / baudrate }; +constexpr auto preDelayBR { bitduration * 9.6f * 3.5f * 1e6 }; +constexpr auto postDelayBR { bitduration * 9.6f * 3.5f * 1e6 }; +// constexpr auto preDelayBR { bitduration * 10.0f * 3.5f * 1e6 }; + +int counter = 0; + +void setup() { + Serial.begin(9600); + while (!Serial); + + Serial.println("Modbus RTU Client"); + + RS485.setDelays(preDelayBR, postDelayBR); + + // Start the Modbus RTU client + if (!ModbusRTUClient.begin(baudrate, SERIAL_8E1)) { + Serial.println("Failed to start Modbus RTU Client!"); + while (1); + } +} + +void loop() { + writeCoilValues(); + + readCoilValues(); + + readDiscreteInputValues(); + + writeHoldingRegisterValues(); + + readHoldingRegisterValues(); + + readInputRegisterValues(); + + counter++; + + delay(5000); + Serial.println(); +} + +/** + Writes Coil values to the server under specified address. +*/ +void writeCoilValues() { + // Set the coils to 1 when counter is odd + byte coilValue = ((counter % 2) == 0) ? 0x00 : 0x01; + + Serial.print("Writing Coil values ... "); + + // Srite 10 Coil values to (server) id 42, address 0x00 + ModbusRTUClient.beginTransmission(42, COILS, 0x00, 10); + for (int i = 0; i < 10; i++) { + ModbusRTUClient.write(coilValue); + } + if (!ModbusRTUClient.endTransmission()) { + Serial.print("failed! "); + Serial.println(ModbusRTUClient.lastError()); + } else { + Serial.println("success"); + } + + // Alternatively, to write a single Coil value use: + // ModbusRTUClient.coilWrite(...) +} + +/** + Reads Coil values from the server under specified address. +*/ +void readCoilValues() { + Serial.print("Reading Coil values ... "); + + // Read 10 Coil values from (server) id 42, address 0x00 + if (!ModbusRTUClient.requestFrom(42, COILS, 0x00, 10)) { + Serial.print("failed! "); + Serial.println(ModbusRTUClient.lastError()); + } else { + Serial.println("success"); + + while (ModbusRTUClient.available()) { + Serial.print(ModbusRTUClient.read()); + Serial.print(' '); + } + Serial.println(); + } + + // Alternatively, to read a single Coil value use: + // ModbusRTUClient.coilRead(...) +} + +/** + Reads Discrete Input values from the server under specified address. +*/ +void readDiscreteInputValues() { + Serial.print("Reading Discrete Input values ... "); + + // Read 10 Discrete Input values from (server) id 42, address 0x00 + if (!ModbusRTUClient.requestFrom(42, DISCRETE_INPUTS, 0x00, 10)) { + Serial.print("failed! "); + Serial.println(ModbusRTUClient.lastError()); + } else { + Serial.println("success"); + + while (ModbusRTUClient.available()) { + Serial.print(ModbusRTUClient.read()); + Serial.print(' '); + } + Serial.println(); + } + + // Alternatively, to read a single Discrete Input value use: + // ModbusRTUClient.discreteInputRead(...) +} + +/** + Writes Holding Register values to the server under specified address. +*/ +void writeHoldingRegisterValues() { + //Set the Holding Register values to counter + Serial.print("Writing Holding Registers values ... "); + + // Write 10 coil values to (server) id 42, address 0x00 + ModbusRTUClient.beginTransmission(42, HOLDING_REGISTERS, 0x00, 10); + for (int i = 0; i < 10; i++) { + ModbusRTUClient.write(counter); + } + if (!ModbusRTUClient.endTransmission()) { + Serial.print("failed! "); + Serial.println(ModbusRTUClient.lastError()); + } else { + Serial.println("success"); + } + + // Alternatively, to write a single Holding Register value use: + // ModbusRTUClient.holdingRegisterWrite(...) +} + +/** + Reads Holding Register values from the server under specified address. +*/ +void readHoldingRegisterValues() { + Serial.print("Reading Holding Register values ... "); + + // Read 10 Input Register values from (server) id 42, address 0x00 + if (!ModbusRTUClient.requestFrom(42, HOLDING_REGISTERS, 0x00, 10)) { + Serial.print("failed! "); + Serial.println(ModbusRTUClient.lastError()); + } else { + Serial.println("success"); + + while (ModbusRTUClient.available()) { + Serial.print(ModbusRTUClient.read()); + Serial.print(' '); + } + Serial.println(); + } + + // Alternatively, to read a single Holding Register value use: + // ModbusRTUClient.holdingRegisterRead(...) +} + +/** + Reads Input Register values from the server under specified address. +*/ +void readInputRegisterValues() { + Serial.print("Reading input register values ... "); + + // Read 10 discrete input values from (server) id 42, + if (!ModbusRTUClient.requestFrom(42, INPUT_REGISTERS, 0x00, 10)) { + Serial.print("failed! "); + Serial.println(ModbusRTUClient.lastError()); + } else { + Serial.println("success"); + + while (ModbusRTUClient.available()) { + Serial.print(ModbusRTUClient.read()); + Serial.print(' '); + } + Serial.println(); + } + + // Alternatively, to read a single Input Register value use: + // ModbusRTUClient.inputRegisterRead(...) +} +``` + +#### Modbus RTU Server + +In the Opta™ Server, the main task will be to poll for Modbus RTU requests and return configured values when requested. It requires following the same initial configuration as the Opta™ Client. The main difference between the Client and the Server devices lies in the `setup()` function: + +```arduino +#include // ArduinoModbus depends on the ArduinoRS485 library +#include + +constexpr auto baudrate { 19200 }; + +// Calculate preDelay and postDelay in microseconds as per Modbus RTU Specification +// MODBUS over serial line specification and implementation guide V1.02 +// Paragraph 2.5.1.1 MODBUS Message RTU Framing +// https://modbus.org/docs/Modbus_over_serial_line_V1_02.pdf +constexpr auto bitduration { 1.f / baudrate }; +constexpr auto preDelayBR { bitduration * 9.6f * 3.5f * 1e6 }; +constexpr auto postDelayBR { bitduration * 9.6f * 3.5f * 1e6 }; +// constexpr auto preDelayBR { bitduration * 10.0f * 3.5f * 1e6 }; + +const int numCoils = 10; +const int numDiscreteInputs = 10; +const int numHoldingRegisters = 10; +const int numInputRegisters = 10; + +void setup() { + Serial.begin(9600); + while (!Serial); + + Serial.println("Modbus RTU Server"); + + RS485.setDelays(preDelayBR, postDelayBR); + + // Start the Modbus RTU client + if (!ModbusRTUServer.begin(42, baudrate, SERIAL_8E1)) { + Serial.println("Failed to start Modbus RTU Server!"); + + while (1); + } + + // Configure coils at address 0x00 + ModbusRTUServer.configureCoils(0x00, numCoils); + + // Configure discrete inputs at address 0x00 + ModbusRTUServer.configureDiscreteInputs(0x00, numDiscreteInputs); + + // Configure holding registers at address 0x00 + ModbusRTUServer.configureHoldingRegisters(0x00, numHoldingRegisters); + + // Configure input registers at address 0x00 + ModbusRTUServer.configureInputRegisters(0x00, numInputRegisters); +} +``` + +In the `setup()` function of the sketch dedicated to the Modbus server, the Server address is assigned with an identifier that will be recognized by the Client. Also, the initial values of the `Coils`, `Discrete Input`, `Holding`, and `Input` registers are configured. These are the data that the Client will locate and retrieve. The following method is necessary in the Server `loop()` function: + +```arduino +ModbusRTUServer.poll(); +``` + +This is the method that polls for Modbus RTU requests. The complete code for the Server is shown below: + +```arduino +/** + Getting Started with Modbus RTU on Opta™ + Name: Opta_Server + Purpose: Configures Coils, Discrete Inputs, Holding and Input Registers; Polls for Modbus RTU requests and maps the coil values to the Discrete Input values, and Holding Registers to the Input Register values. + + @author Arduino +*/ + +#include // ArduinoModbus depends on the ArduinoRS485 library +#include + +constexpr auto baudrate { 19200 }; + +// Calculate preDelay and postDelay in microseconds as per Modbus RTU Specification +// MODBUS over serial line specification and implementation guide V1.02 +// Paragraph 2.5.1.1 MODBUS Message RTU Framing +// https://modbus.org/docs/Modbus_over_serial_line_V1_02.pdf +constexpr auto bitduration { 1.f / baudrate }; +constexpr auto preDelayBR { bitduration * 9.6f * 3.5f * 1e6 }; +constexpr auto postDelayBR { bitduration * 9.6f * 3.5f * 1e6 }; +// constexpr auto preDelayBR { bitduration * 10.0f * 3.5f * 1e6 }; + +const int numCoils = 10; +const int numDiscreteInputs = 10; +const int numHoldingRegisters = 10; +const int numInputRegisters = 10; + +void setup() { + Serial.begin(9600); + while (!Serial); + + Serial.println("Modbus RTU Server"); + + RS485.setDelays(preDelayBR, postDelayBR); + + // Start the Modbus RTU client + if (!ModbusRTUServer.begin(42, baudrate, SERIAL_8E1)) { + Serial.println("Failed to start Modbus RTU Client!"); + while (1); + } + + // Configure coils at address 0x00 + ModbusRTUServer.configureCoils(0x00, numCoils); + + // Configure discrete inputs at address 0x00 + ModbusRTUServer.configureDiscreteInputs(0x00, numDiscreteInputs); + + // Configure holding registers at address 0x00 + ModbusRTUServer.configureHoldingRegisters(0x00, numHoldingRegisters); + + // Configure input registers at address 0x00 + ModbusRTUServer.configureInputRegisters(0x00, numInputRegisters); +} + +void loop() { + // Poll for Modbus RTU requests + ModbusRTUServer.poll(); + + // Map the coil values to the discrete input values + for (int i = 0; i < numCoils; i++) { + int coilValue = ModbusRTUServer.coilRead(i); + + ModbusRTUServer.discreteInputWrite(i, coilValue); + } + + // Map the holding register values to the input register values + for (int i = 0; i < numHoldingRegisters; i++) { + long holdingRegisterValue = ModbusRTUServer.holdingRegisterRead(i); + + ModbusRTUServer.inputRegisterWrite(i, holdingRegisterValue); + } +} +``` + +### Testing the Modbus RTU Client and Server + +Once the Modbus RTU Client and Server code for each Opta™ device has been uploaded, a `Success!` message will be displayed on the Serial Monitor of Opta™ Client after each read-and-write task: + +![Modbus RTU Client and Server communication status](assets/opta-modbus-client.svg) + +## Conclusion + +This tutorial demonstrates how to use the Arduino ecosystem's `ArduinoRS485` and `ArduinoModbus` libraries, as well as the Arduino IDE, to implement the Modbus RTU protocol between two Opta™ devices. These are necessary elements to enable connection with Modbus RTU compliant devices. + +With the help of these examples, it is easy to understand how to enable Modbus RTU communication between a Server and a Client. For further project developments, it offers a scalable architecture to link additional Modbus Server devices, such as secondary Opta™ or a Modbus RTU-compatible module. + +### Next Steps + Now that you know how to establish and use Modbus RTU communication with Opta™, you can take a look at [Getting started with connectivity on the Opta™ tutorial](/tutorials/opta/getting-started-connectivity) to discover more about all the connectivity possibilities that Opta™ has to offer. \ No newline at end of file diff --git a/content/hardware/05.pro-solutions/solutions-and-kits/opta/tutorials/getting-started-with-rs485/assets/Opta_RS485_Example.zip b/content/hardware/07.opta/opta-family/opta/tutorials/getting-started-with-rs485/assets/Opta_RS485_Example.zip similarity index 100% rename from content/hardware/05.pro-solutions/solutions-and-kits/opta/tutorials/getting-started-with-rs485/assets/Opta_RS485_Example.zip rename to content/hardware/07.opta/opta-family/opta/tutorials/getting-started-with-rs485/assets/Opta_RS485_Example.zip diff --git a/content/hardware/05.pro-solutions/solutions-and-kits/opta/tutorials/getting-started-with-rs485/assets/opta-modbus-connection.svg b/content/hardware/07.opta/opta-family/opta/tutorials/getting-started-with-rs485/assets/opta-modbus-connection.svg similarity index 100% rename from content/hardware/05.pro-solutions/solutions-and-kits/opta/tutorials/getting-started-with-rs485/assets/opta-modbus-connection.svg rename to content/hardware/07.opta/opta-family/opta/tutorials/getting-started-with-rs485/assets/opta-modbus-connection.svg diff --git a/content/hardware/05.pro-solutions/solutions-and-kits/opta/tutorials/getting-started-with-rs485/content.md b/content/hardware/07.opta/opta-family/opta/tutorials/getting-started-with-rs485/content.md similarity index 98% rename from content/hardware/05.pro-solutions/solutions-and-kits/opta/tutorials/getting-started-with-rs485/content.md rename to content/hardware/07.opta/opta-family/opta/tutorials/getting-started-with-rs485/content.md index 58fcdb2613..c20743cbb7 100644 --- a/content/hardware/05.pro-solutions/solutions-and-kits/opta/tutorials/getting-started-with-rs485/content.md +++ b/content/hardware/07.opta/opta-family/opta/tutorials/getting-started-with-rs485/content.md @@ -1,231 +1,231 @@ ---- -title: 'Getting Started with RS-485 on Opta™' -description: "Learn how to make use of the RS-485 communication interface on Opta™." -difficulty: beginner -tags: - - Getting started - - RS-485 -author: 'Benjamin Dannegård and Taddy Chung' -libraries: - - name: ArduinoRS485 - url: https://www.arduino.cc/reference/en/libraries/arduinors485/ -software: - - ide-v1 - - ide-v2 -hardware: - - hardware/05.pro-solutions/solutions-and-kits/opta ---- - -## Overview - -The Opta™ micro PLC offers an easy-to-use and readily-available RS-485 interface. The RS-485 interface provides balanced performance to transmit data reliably over a long distance, with a stable transmission rate. Thanks to the Arduino ecosystem tools, such as the [Arduino IDE](https://www.arduino.cc/en/software) and the [ArduinoRS485 library](https://www.arduino.cc/reference/en/libraries/arduinors485/), it is really easy to implement communication protocols using the RS-485 interface. - -This tutorial will show the steps to connect two Opta™ devices via RS-485 and the Arduino ecosystem tools; it will describe some essential functions of the [ArduinoRS485](https://www.arduino.cc/reference/en/libraries/arduinors485/) library and show an [example sketch](assets/Opta_RS485_Example.zip) that uses the library. - -## Goals - -- Learn how to connect two Opta™ devices through the RS-485 interface -- Learn how to exchange information between two Opta™ devices through the RS-485 interface and use it to control the onboard features of the Opta™ - -### Required Hardware and Software - -- Opta™ PLC with RS-485 support (x2) -- 12-24VDC/1A power supply (x1) -- 24AWG twisted-pair cable (used for electrical connections) -- USB-C® cable (x1) -- [Arduino IDE 1.8.10+](https://www.arduino.cc/en/software), [Arduino IDE 2.0+](https://www.arduino.cc/en/software), or [Arduino Web Editor](https://create.arduino.cc/editor) -- [ArduinoRS485 library](https://www.arduino.cc/reference/en/libraries/arduinors485/) -- [RS-485 example code](assets/Opta_RS485_Example.zip) - -***Notice: Please note that this tutorial is intended to work only with the Opta™ variants that have an RS-485 interface. Check your product information to know more.*** - -## The RS-485 Interface - -The RS-485 is an electrical standard using a differential bus with voltage levels between 0-5V. The multi-drop feature allows the addition of drivers and receivers to the transmission line. The RS-485 interface has good noise immunity thanks to the differential signaling, which is a well-suited characteristic for industrial environment applications. - -The RS-485 does not define a data communication protocol since it does not know how to interpret such information nor when or what to do to process it: it is only an electrical standard. An example of a data communication protocol using RS-485 is Modbus RTU. For more information about this data communication protocol, you can check our [getting started with Modbus RTU tutorial](/tutorials/opta/getting-started-with-modbus-rtu) with the Opta™. - -## Instructions - -### Setting up the Arduino IDE - -This tutorial will need the latest version of the Arduino IDE. You can download the Arduino IDE [here](https://www.arduino.cc/en/software). Please check the [getting started with the Opta™ tutorial](/tutorials/opta/getting-started) if it is your first time setting up the Opta™ with the Arduino IDE. - -The [ArduinoRS485 library](https://www.arduino.cc/reference/en/libraries/arduinors485/) will be used to simplify the use of RS-485 communication interface on Opta™. This library can be installed via Arduino IDE Library Manager; make sure to install the latest version of the library. - -### The RS-485 Interface in Opta™ - -Please refer to the following diagram for connecting two Opta™ devices via their RS-485 interface. The figure also indicates other onboard features of the Opta™, such as its status LEDs and relays which will be used during the tutorial. - -![Connection of two Opta™ devices via RS-485](assets/opta-modbus-connection.svg) - -### Example Overview - -We will define one Opta™ as sender and the other as receiver device. As the roles suggest, each Opta™ has a specific task. In the case of the Opta™ acting as sender, the device will await for data from `1` to `4` via the serial monitor. The Arduino IDE provides a serial monitor that can be used for this task. Each number represents the relay to trigger and its corresponding status LED. - -The Opta™ acting as receiver will get the incoming data, decode them, and discard non-valid or out-of-range data. The decoded data will switch the relay state and the status LED to the opposite of the current state. For instance, if the receiver captures a `2` from the sender while the receiver has its 2nd relay closed with a turned-on 2nd status LED, the receiver will open the relay and turn off the 2nd status LED as a deactivation indication. - -The other way around, in case of an open relay/LED off status, Opta™ will close the relay and turn on the status LED corresponding to the number received in the recent transmission. The same occurs for all the pairs of relays/status LEDs. - -### The Opta™ Sender Sketch - -The first step to do is to define the RS-485 transmission parameters: - -```arduino -#include - -constexpr auto baudrate{ 115200 }; - -// Calculate preDelay and postDelay in microseconds for stable RS-485 transmission -constexpr auto bitduration{ 1.f / baudrate }; -constexpr auto wordlen{ 9.6f }; // OR 10.0f depending on the channel configuration -constexpr auto preDelayBR{ bitduration * wordlen * 3.5f * 1e6 }; -constexpr auto postDelayBR{ bitduration * wordlen * 3.5f * 1e6 }; -``` - -These transmission parameters, applied in the Opta™ initialization, are crucial for a stable RS-485 data transmission as they will define the communication timings to make sure the lines of the RS-485 are already in a stable state. **Remember that it is necessary to have a matching baud rate between the sender and the receiver devices for stable operation**. In this tutorial, we are using a baud rate of `115200`, but it can be configured at a different baud rate: - -```arduino -void setup() { - Serial.begin(baudrate); - while (!Serial); - - RS485.begin(baudrate); - RS485.setDelays(preDelayBR, postDelayBR); -} -``` - -The sender's job is to pack and transmit data to the receiver. Inside the main loop of the sketch, the sender will capture input data from the serial port and write the data after a series of checks to avoid sending incorrect data. Before converting the data to an integer, it is necessary to discard the end-of-line (EOL) as shown in the sketch. - -The `RS485.beginTransmission()` method enables the RS-485 transmission. Subsequently, the `RS485.write(incomingByte)` method sends data as a byte or a series of bytes by writing their binary data to the serial port. In this case, we are sending to the receiver the `incomingByte` variable that contains the input data converted to an integer. The `RS485.endTransmission()` method then ends the RS-485 transmission, finishing the operation cycle. - -```arduino -void loop() { - auto aval = Serial.available(); - if (aval > 0) { - auto input = Serial.readStringUntil('\r'); - - // Discard EOL - auto read = input.length(); - while (aval > ++read) - Serial.read(); - - auto incomingByte = input.toInt(); - RS485.beginTransmission(); - Serial.print("- Sending: "); - Serial.println(incomingByte); - RS485.write(incomingByte); - RS485.endTransmission(); - } -} -``` - -### The Opta™ Receiver Sketch - -The receiver has the same configuration as the sender. Although, since it needs to trigger the relays with their corresponding status LEDs based on the received data, it also configures the relays, built-in LEDs, and their status: - -```arduino -int idx{ 0 }; -bool newState{ false }; - -int relays[]{ D0, D1, D2, D3 }; -int leds[]{ LED_D0, LED_D1, LED_D2, LED_D3 }; -bool statuses[]{ true, true, true, true }; -``` - -After initializing the RS-485 interface, the relays and the status LEDs are set as `OUTPUTS`. It will later help to control the relay with its corresponding visual indicator based on the received data over the RS-485: - -```arduino -void setup() { - for (int i = 0; i < 4; i++) { - pinMode(relays[i], OUTPUT); - pinMode(leds[i], OUTPUT); - } - - RS485.begin(baudrate); - RS485.setDelays(preDelayBR, postDelayBR); - - Serial.begin(baudrate); - while (!Serial); -} -``` - -In the main loop of the sketch, we will seek data sent over RS-485 and handle them accordingly. The loop manages out-of-range inputs and considers in-range data for the actuation of the intended relay and status LED. If the sender device forwards values that are not between `1` and `4`, the `readValue` variable will go through a module operation and return the remainder from the integer division to use as a correct input. - -The `RS485.receive()` method enables the data reception via RS-485, then the `RS485.available()` method is used to determine if there are data available to be read. Once the data are available, the `RS485.read()` method will read the data and store them in the `readValue` variable. Finally, after managing the received data, the `RS485.noReceive()` method is called to disable the data reception over RS-485: - -```arduino -void loop() { - - RS485.receive(); - auto aval = RS485.available(); - if (aval > 0) { - int readValue = RS485.read(); - - // Manage out-of-range inputs - if (readValue > 4) - readValue = readValue % 4; - - Serial.print("Command for relay: "); - Serial.println(readValue); - newState = true; - - // Array indexes start at 0 - idx = readValue - 1; - } - RS485.noReceive(); - - if (newState) { - changeRelay(); - newState = false; - } -} -``` - -The `changeRelay()` function manages the relay and status LED state based on the received input packet. This function is called after receiving data via RS-485 to update the relay and status LED states accordingly: - -```arduino -/** - Changes relay and status LED state given the received value. -*/ -void changeRelay() { - // Get current status - auto status = statuses[idx] ? HIGH : LOW; - - // Apply new status to the outputs - digitalWrite(relays[idx], status); - digitalWrite(leds[idx], status); - - // Invert the statuses array to be updated - statuses[idx] = !statuses[idx]; -} -``` - -### Full Example Code - -You can access the complete example code [here](assets/Opta_RS485_Example.zip); after extracting the files, `Opta_RS485_Sender` and `Opta_RS485_Receiver` sketches are available to try with your Opta™ devices. - -### Testing Out the Sketches - -Now it is time to test the application. Using the Serial Monitor of the Arduino IDE, send a value between `1` and `4` with the sender device. Sending a `1` will close the 1st relay and turn on the corresponding status LED of the receiver Opta™ device. Sending a `1` again will open the 1st relay and turn off the status LED of the receiver device. - -Here is a list of the values the receiver Opta™ device can receive and the result they produce: - -- **Sending `1`**: The first relay and the first status LED will turn on or off -- **Sending `2`**: The second relay and the second status LED will turn on or off -- **Sending `3`**: The third relay and the third status LED will turn on or off -- **Sending `4`**: The fourth relay and the fourth status LED will turn on or off - -## Conclusion - -In this tutorial, we established an RS-485 connection between two Opta™ devices. We also learned how to use the `ArduinoRS485.h` library to send and receive values between these two devices using RS-485 layer. Finally, the tutorial showed how to take the data sent via RS-485 to interact with the Opta™ PLC's hardware features, such as its onboard relays and status LEDs. - -### Next Steps - -Now that you are familiar with the RS-485 communication interface on the Opta™, take a look at the following documentation to learn more: - -* Take a look at [getting started tutorial](/tutorials/opta/getting-started) to get a better overview of the features of Opta™ - -* If you wish to incorporate Wi-Fi®/Bluetooth® Low Energy in your Opta™ solutions, have a look at [connectivity tutorial](/tutorials/opta/getting-started-connectivity) - -* If you are interested in seeing the RS-485 interface and the Opta™ being put to work in a real-life scenario, check the [tank level application note](/tutorials/opta/tank-level-app-note) +--- +title: 'Getting Started with RS-485 on Opta™' +description: "Learn how to make use of the RS-485 communication interface on Opta™." +difficulty: beginner +tags: + - Getting started + - RS-485 +author: 'Benjamin Dannegård and Taddy Chung' +libraries: + - name: ArduinoRS485 + url: https://www.arduino.cc/reference/en/libraries/arduinors485/ +software: + - ide-v1 + - ide-v2 +hardware: + - hardware/05.pro-solutions/solutions-and-kits/opta +--- + +## Overview + +The Opta™ micro PLC offers an easy-to-use and readily-available RS-485 interface. The RS-485 interface provides balanced performance to transmit data reliably over a long distance, with a stable transmission rate. Thanks to the Arduino ecosystem tools, such as the [Arduino IDE](https://www.arduino.cc/en/software) and the [ArduinoRS485 library](https://www.arduino.cc/reference/en/libraries/arduinors485/), it is really easy to implement communication protocols using the RS-485 interface. + +This tutorial will show the steps to connect two Opta™ devices via RS-485 and the Arduino ecosystem tools; it will describe some essential functions of the [ArduinoRS485](https://www.arduino.cc/reference/en/libraries/arduinors485/) library and show an [example sketch](assets/Opta_RS485_Example.zip) that uses the library. + +## Goals + +- Learn how to connect two Opta™ devices through the RS-485 interface +- Learn how to exchange information between two Opta™ devices through the RS-485 interface and use it to control the onboard features of the Opta™ + +### Required Hardware and Software + +- Opta™ PLC with RS-485 support (x2) +- 12-24VDC/1A power supply (x1) +- 24AWG twisted-pair cable (used for electrical connections) +- USB-C® cable (x1) +- [Arduino IDE 1.8.10+](https://www.arduino.cc/en/software), [Arduino IDE 2.0+](https://www.arduino.cc/en/software), or [Arduino Web Editor](https://create.arduino.cc/editor) +- [ArduinoRS485 library](https://www.arduino.cc/reference/en/libraries/arduinors485/) +- [RS-485 example code](assets/Opta_RS485_Example.zip) + +***Notice: Please note that this tutorial is intended to work only with the Opta™ variants that have an RS-485 interface. Check your product information to know more.*** + +## The RS-485 Interface + +The RS-485 is an electrical standard using a differential bus with voltage levels between 0-5V. The multi-drop feature allows the addition of drivers and receivers to the transmission line. The RS-485 interface has good noise immunity thanks to the differential signaling, which is a well-suited characteristic for industrial environment applications. + +The RS-485 does not define a data communication protocol since it does not know how to interpret such information nor when or what to do to process it: it is only an electrical standard. An example of a data communication protocol using RS-485 is Modbus RTU. For more information about this data communication protocol, you can check our [getting started with Modbus RTU tutorial](/tutorials/opta/getting-started-with-modbus-rtu) with the Opta™. + +## Instructions + +### Setting up the Arduino IDE + +This tutorial will need the latest version of the Arduino IDE. You can download the Arduino IDE [here](https://www.arduino.cc/en/software). Please check the [getting started with the Opta™ tutorial](/tutorials/opta/getting-started) if it is your first time setting up the Opta™ with the Arduino IDE. + +The [ArduinoRS485 library](https://www.arduino.cc/reference/en/libraries/arduinors485/) will be used to simplify the use of RS-485 communication interface on Opta™. This library can be installed via Arduino IDE Library Manager; make sure to install the latest version of the library. + +### The RS-485 Interface in Opta™ + +Please refer to the following diagram for connecting two Opta™ devices via their RS-485 interface. The figure also indicates other onboard features of the Opta™, such as its status LEDs and relays which will be used during the tutorial. + +![Connection of two Opta™ devices via RS-485](assets/opta-modbus-connection.svg) + +### Example Overview + +We will define one Opta™ as sender and the other as receiver device. As the roles suggest, each Opta™ has a specific task. In the case of the Opta™ acting as sender, the device will await for data from `1` to `4` via the serial monitor. The Arduino IDE provides a serial monitor that can be used for this task. Each number represents the relay to trigger and its corresponding status LED. + +The Opta™ acting as receiver will get the incoming data, decode them, and discard non-valid or out-of-range data. The decoded data will switch the relay state and the status LED to the opposite of the current state. For instance, if the receiver captures a `2` from the sender while the receiver has its 2nd relay closed with a turned-on 2nd status LED, the receiver will open the relay and turn off the 2nd status LED as a deactivation indication. + +The other way around, in case of an open relay/LED off status, Opta™ will close the relay and turn on the status LED corresponding to the number received in the recent transmission. The same occurs for all the pairs of relays/status LEDs. + +### The Opta™ Sender Sketch + +The first step to do is to define the RS-485 transmission parameters: + +```arduino +#include + +constexpr auto baudrate{ 115200 }; + +// Calculate preDelay and postDelay in microseconds for stable RS-485 transmission +constexpr auto bitduration{ 1.f / baudrate }; +constexpr auto wordlen{ 9.6f }; // OR 10.0f depending on the channel configuration +constexpr auto preDelayBR{ bitduration * wordlen * 3.5f * 1e6 }; +constexpr auto postDelayBR{ bitduration * wordlen * 3.5f * 1e6 }; +``` + +These transmission parameters, applied in the Opta™ initialization, are crucial for a stable RS-485 data transmission as they will define the communication timings to make sure the lines of the RS-485 are already in a stable state. **Remember that it is necessary to have a matching baud rate between the sender and the receiver devices for stable operation**. In this tutorial, we are using a baud rate of `115200`, but it can be configured at a different baud rate: + +```arduino +void setup() { + Serial.begin(baudrate); + while (!Serial); + + RS485.begin(baudrate); + RS485.setDelays(preDelayBR, postDelayBR); +} +``` + +The sender's job is to pack and transmit data to the receiver. Inside the main loop of the sketch, the sender will capture input data from the serial port and write the data after a series of checks to avoid sending incorrect data. Before converting the data to an integer, it is necessary to discard the end-of-line (EOL) as shown in the sketch. + +The `RS485.beginTransmission()` method enables the RS-485 transmission. Subsequently, the `RS485.write(incomingByte)` method sends data as a byte or a series of bytes by writing their binary data to the serial port. In this case, we are sending to the receiver the `incomingByte` variable that contains the input data converted to an integer. The `RS485.endTransmission()` method then ends the RS-485 transmission, finishing the operation cycle. + +```arduino +void loop() { + auto aval = Serial.available(); + if (aval > 0) { + auto input = Serial.readStringUntil('\r'); + + // Discard EOL + auto read = input.length(); + while (aval > ++read) + Serial.read(); + + auto incomingByte = input.toInt(); + RS485.beginTransmission(); + Serial.print("- Sending: "); + Serial.println(incomingByte); + RS485.write(incomingByte); + RS485.endTransmission(); + } +} +``` + +### The Opta™ Receiver Sketch + +The receiver has the same configuration as the sender. Although, since it needs to trigger the relays with their corresponding status LEDs based on the received data, it also configures the relays, built-in LEDs, and their status: + +```arduino +int idx{ 0 }; +bool newState{ false }; + +int relays[]{ D0, D1, D2, D3 }; +int leds[]{ LED_D0, LED_D1, LED_D2, LED_D3 }; +bool statuses[]{ true, true, true, true }; +``` + +After initializing the RS-485 interface, the relays and the status LEDs are set as `OUTPUTS`. It will later help to control the relay with its corresponding visual indicator based on the received data over the RS-485: + +```arduino +void setup() { + for (int i = 0; i < 4; i++) { + pinMode(relays[i], OUTPUT); + pinMode(leds[i], OUTPUT); + } + + RS485.begin(baudrate); + RS485.setDelays(preDelayBR, postDelayBR); + + Serial.begin(baudrate); + while (!Serial); +} +``` + +In the main loop of the sketch, we will seek data sent over RS-485 and handle them accordingly. The loop manages out-of-range inputs and considers in-range data for the actuation of the intended relay and status LED. If the sender device forwards values that are not between `1` and `4`, the `readValue` variable will go through a module operation and return the remainder from the integer division to use as a correct input. + +The `RS485.receive()` method enables the data reception via RS-485, then the `RS485.available()` method is used to determine if there are data available to be read. Once the data are available, the `RS485.read()` method will read the data and store them in the `readValue` variable. Finally, after managing the received data, the `RS485.noReceive()` method is called to disable the data reception over RS-485: + +```arduino +void loop() { + + RS485.receive(); + auto aval = RS485.available(); + if (aval > 0) { + int readValue = RS485.read(); + + // Manage out-of-range inputs + if (readValue > 4) + readValue = readValue % 4; + + Serial.print("Command for relay: "); + Serial.println(readValue); + newState = true; + + // Array indexes start at 0 + idx = readValue - 1; + } + RS485.noReceive(); + + if (newState) { + changeRelay(); + newState = false; + } +} +``` + +The `changeRelay()` function manages the relay and status LED state based on the received input packet. This function is called after receiving data via RS-485 to update the relay and status LED states accordingly: + +```arduino +/** + Changes relay and status LED state given the received value. +*/ +void changeRelay() { + // Get current status + auto status = statuses[idx] ? HIGH : LOW; + + // Apply new status to the outputs + digitalWrite(relays[idx], status); + digitalWrite(leds[idx], status); + + // Invert the statuses array to be updated + statuses[idx] = !statuses[idx]; +} +``` + +### Full Example Code + +You can access the complete example code [here](assets/Opta_RS485_Example.zip); after extracting the files, `Opta_RS485_Sender` and `Opta_RS485_Receiver` sketches are available to try with your Opta™ devices. + +### Testing Out the Sketches + +Now it is time to test the application. Using the Serial Monitor of the Arduino IDE, send a value between `1` and `4` with the sender device. Sending a `1` will close the 1st relay and turn on the corresponding status LED of the receiver Opta™ device. Sending a `1` again will open the 1st relay and turn off the status LED of the receiver device. + +Here is a list of the values the receiver Opta™ device can receive and the result they produce: + +- **Sending `1`**: The first relay and the first status LED will turn on or off +- **Sending `2`**: The second relay and the second status LED will turn on or off +- **Sending `3`**: The third relay and the third status LED will turn on or off +- **Sending `4`**: The fourth relay and the fourth status LED will turn on or off + +## Conclusion + +In this tutorial, we established an RS-485 connection between two Opta™ devices. We also learned how to use the `ArduinoRS485.h` library to send and receive values between these two devices using RS-485 layer. Finally, the tutorial showed how to take the data sent via RS-485 to interact with the Opta™ PLC's hardware features, such as its onboard relays and status LEDs. + +### Next Steps + +Now that you are familiar with the RS-485 communication interface on the Opta™, take a look at the following documentation to learn more: + +* Take a look at [getting started tutorial](/tutorials/opta/getting-started) to get a better overview of the features of Opta™ + +* If you wish to incorporate Wi-Fi®/Bluetooth® Low Energy in your Opta™ solutions, have a look at [connectivity tutorial](/tutorials/opta/getting-started-connectivity) + +* If you are interested in seeing the RS-485 interface and the Opta™ being put to work in a real-life scenario, check the [tank level application note](/tutorials/opta/tank-level-app-note) diff --git a/content/hardware/05.pro-solutions/solutions-and-kits/opta/tutorials/getting-started-with-rs485/hero-banner.png b/content/hardware/07.opta/opta-family/opta/tutorials/getting-started-with-rs485/hero-banner.png similarity index 100% rename from content/hardware/05.pro-solutions/solutions-and-kits/opta/tutorials/getting-started-with-rs485/hero-banner.png rename to content/hardware/07.opta/opta-family/opta/tutorials/getting-started-with-rs485/hero-banner.png diff --git a/content/hardware/05.pro-solutions/solutions-and-kits/opta/tutorials/getting-started/assets/opta-analog-inputs.svg b/content/hardware/07.opta/opta-family/opta/tutorials/getting-started/assets/opta-analog-inputs.svg similarity index 100% rename from content/hardware/05.pro-solutions/solutions-and-kits/opta/tutorials/getting-started/assets/opta-analog-inputs.svg rename to content/hardware/07.opta/opta-family/opta/tutorials/getting-started/assets/opta-analog-inputs.svg diff --git a/content/hardware/05.pro-solutions/solutions-and-kits/opta/tutorials/getting-started/assets/opta-clean-contact.svg b/content/hardware/07.opta/opta-family/opta/tutorials/getting-started/assets/opta-clean-contact.svg similarity index 100% rename from content/hardware/05.pro-solutions/solutions-and-kits/opta/tutorials/getting-started/assets/opta-clean-contact.svg rename to content/hardware/07.opta/opta-family/opta/tutorials/getting-started/assets/opta-clean-contact.svg diff --git a/content/hardware/05.pro-solutions/solutions-and-kits/opta/tutorials/getting-started/assets/opta-core-install.png b/content/hardware/07.opta/opta-family/opta/tutorials/getting-started/assets/opta-core-install.png similarity index 100% rename from content/hardware/05.pro-solutions/solutions-and-kits/opta/tutorials/getting-started/assets/opta-core-install.png rename to content/hardware/07.opta/opta-family/opta/tutorials/getting-started/assets/opta-core-install.png diff --git a/content/hardware/05.pro-solutions/solutions-and-kits/opta/tutorials/getting-started/assets/opta-device-LED.svg b/content/hardware/07.opta/opta-family/opta/tutorials/getting-started/assets/opta-device-LED.svg similarity index 100% rename from content/hardware/05.pro-solutions/solutions-and-kits/opta/tutorials/getting-started/assets/opta-device-LED.svg rename to content/hardware/07.opta/opta-family/opta/tutorials/getting-started/assets/opta-device-LED.svg diff --git a/content/hardware/05.pro-solutions/solutions-and-kits/opta/tutorials/getting-started/assets/opta-device-button.svg b/content/hardware/07.opta/opta-family/opta/tutorials/getting-started/assets/opta-device-button.svg similarity index 100% rename from content/hardware/05.pro-solutions/solutions-and-kits/opta/tutorials/getting-started/assets/opta-device-button.svg rename to content/hardware/07.opta/opta-family/opta/tutorials/getting-started/assets/opta-device-button.svg diff --git a/content/hardware/05.pro-solutions/solutions-and-kits/opta/tutorials/getting-started/assets/opta-device.svg b/content/hardware/07.opta/opta-family/opta/tutorials/getting-started/assets/opta-device.svg similarity index 100% rename from content/hardware/05.pro-solutions/solutions-and-kits/opta/tutorials/getting-started/assets/opta-device.svg rename to content/hardware/07.opta/opta-family/opta/tutorials/getting-started/assets/opta-device.svg diff --git a/content/hardware/05.pro-solutions/solutions-and-kits/opta/tutorials/getting-started/assets/opta-out-relays.svg b/content/hardware/07.opta/opta-family/opta/tutorials/getting-started/assets/opta-out-relays.svg similarity index 100% rename from content/hardware/05.pro-solutions/solutions-and-kits/opta/tutorials/getting-started/assets/opta-out-relays.svg rename to content/hardware/07.opta/opta-family/opta/tutorials/getting-started/assets/opta-out-relays.svg diff --git a/content/hardware/05.pro-solutions/solutions-and-kits/opta/tutorials/getting-started/assets/opta-voltage-pins.svg b/content/hardware/07.opta/opta-family/opta/tutorials/getting-started/assets/opta-voltage-pins.svg similarity index 100% rename from content/hardware/05.pro-solutions/solutions-and-kits/opta/tutorials/getting-started/assets/opta-voltage-pins.svg rename to content/hardware/07.opta/opta-family/opta/tutorials/getting-started/assets/opta-voltage-pins.svg diff --git a/content/hardware/05.pro-solutions/solutions-and-kits/opta/tutorials/getting-started/content.md b/content/hardware/07.opta/opta-family/opta/tutorials/getting-started/content.md similarity index 100% rename from content/hardware/05.pro-solutions/solutions-and-kits/opta/tutorials/getting-started/content.md rename to content/hardware/07.opta/opta-family/opta/tutorials/getting-started/content.md diff --git a/content/hardware/05.pro-solutions/solutions-and-kits/opta/tutorials/tank-level-app-note/assets/application_representation.svg b/content/hardware/07.opta/opta-family/opta/tutorials/tank-level-app-note/assets/application_representation.svg similarity index 100% rename from content/hardware/05.pro-solutions/solutions-and-kits/opta/tutorials/tank-level-app-note/assets/application_representation.svg rename to content/hardware/07.opta/opta-family/opta/tutorials/tank-level-app-note/assets/application_representation.svg diff --git a/content/hardware/05.pro-solutions/solutions-and-kits/opta/tutorials/tank-level-app-note/assets/cloud_integration.svg b/content/hardware/07.opta/opta-family/opta/tutorials/tank-level-app-note/assets/cloud_integration.svg similarity index 100% rename from content/hardware/05.pro-solutions/solutions-and-kits/opta/tutorials/tank-level-app-note/assets/cloud_integration.svg rename to content/hardware/07.opta/opta-family/opta/tutorials/tank-level-app-note/assets/cloud_integration.svg diff --git a/content/hardware/05.pro-solutions/solutions-and-kits/opta/tutorials/tank-level-app-note/assets/electrical_connections.svg b/content/hardware/07.opta/opta-family/opta/tutorials/tank-level-app-note/assets/electrical_connections.svg similarity index 100% rename from content/hardware/05.pro-solutions/solutions-and-kits/opta/tutorials/tank-level-app-note/assets/electrical_connections.svg rename to content/hardware/07.opta/opta-family/opta/tutorials/tank-level-app-note/assets/electrical_connections.svg diff --git a/content/hardware/05.pro-solutions/solutions-and-kits/opta/tutorials/tank-level-app-note/assets/tank-level-monitoring-sketch.zip b/content/hardware/07.opta/opta-family/opta/tutorials/tank-level-app-note/assets/tank-level-monitoring-sketch.zip similarity index 100% rename from content/hardware/05.pro-solutions/solutions-and-kits/opta/tutorials/tank-level-app-note/assets/tank-level-monitoring-sketch.zip rename to content/hardware/07.opta/opta-family/opta/tutorials/tank-level-app-note/assets/tank-level-monitoring-sketch.zip diff --git a/content/hardware/05.pro-solutions/solutions-and-kits/opta/tutorials/tank-level-app-note/content.md b/content/hardware/07.opta/opta-family/opta/tutorials/tank-level-app-note/content.md similarity index 100% rename from content/hardware/05.pro-solutions/solutions-and-kits/opta/tutorials/tank-level-app-note/content.md rename to content/hardware/07.opta/opta-family/opta/tutorials/tank-level-app-note/content.md diff --git a/content/hardware/05.pro-solutions/solutions-and-kits/opta/tutorials/tank-level-app-note/hero-banner.png b/content/hardware/07.opta/opta-family/opta/tutorials/tank-level-app-note/hero-banner.png similarity index 100% rename from content/hardware/05.pro-solutions/solutions-and-kits/opta/tutorials/tank-level-app-note/hero-banner.png rename to content/hardware/07.opta/opta-family/opta/tutorials/tank-level-app-note/hero-banner.png diff --git a/content/hardware/07.edu/carriers/braccio-carrier/compatibility.yml b/content/hardware/08.edu/carriers/braccio-carrier/compatibility.yml similarity index 100% rename from content/hardware/07.edu/carriers/braccio-carrier/compatibility.yml rename to content/hardware/08.edu/carriers/braccio-carrier/compatibility.yml diff --git a/content/hardware/07.edu/carriers/braccio-carrier/datasheet/assets/Block_Diagram_Braccio_Carrier.svg b/content/hardware/08.edu/carriers/braccio-carrier/datasheet/assets/Block_Diagram_Braccio_Carrier.svg similarity index 100% rename from content/hardware/07.edu/carriers/braccio-carrier/datasheet/assets/Block_Diagram_Braccio_Carrier.svg rename to content/hardware/08.edu/carriers/braccio-carrier/datasheet/assets/Block_Diagram_Braccio_Carrier.svg diff --git a/content/hardware/07.edu/carriers/braccio-carrier/datasheet/assets/Power_Tree_Braccio_Carrier.jpg b/content/hardware/08.edu/carriers/braccio-carrier/datasheet/assets/Power_Tree_Braccio_Carrier.jpg similarity index 100% rename from content/hardware/07.edu/carriers/braccio-carrier/datasheet/assets/Power_Tree_Braccio_Carrier.jpg rename to content/hardware/08.edu/carriers/braccio-carrier/datasheet/assets/Power_Tree_Braccio_Carrier.jpg diff --git a/content/hardware/07.edu/carriers/braccio-carrier/datasheet/assets/System_Block_Diagram_Braccio_Carrier.jpg b/content/hardware/08.edu/carriers/braccio-carrier/datasheet/assets/System_Block_Diagram_Braccio_Carrier.jpg similarity index 100% rename from content/hardware/07.edu/carriers/braccio-carrier/datasheet/assets/System_Block_Diagram_Braccio_Carrier.jpg rename to content/hardware/08.edu/carriers/braccio-carrier/datasheet/assets/System_Block_Diagram_Braccio_Carrier.jpg diff --git a/content/hardware/07.edu/carriers/braccio-carrier/datasheet/assets/braccio-connectors.svg b/content/hardware/08.edu/carriers/braccio-carrier/datasheet/assets/braccio-connectors.svg similarity index 100% rename from content/hardware/07.edu/carriers/braccio-carrier/datasheet/assets/braccio-connectors.svg rename to content/hardware/08.edu/carriers/braccio-carrier/datasheet/assets/braccio-connectors.svg diff --git a/content/hardware/07.edu/carriers/braccio-carrier/datasheet/assets/braccio-mount.svg b/content/hardware/08.edu/carriers/braccio-carrier/datasheet/assets/braccio-mount.svg similarity index 100% rename from content/hardware/07.edu/carriers/braccio-carrier/datasheet/assets/braccio-mount.svg rename to content/hardware/08.edu/carriers/braccio-carrier/datasheet/assets/braccio-mount.svg diff --git a/content/hardware/07.edu/carriers/braccio-carrier/datasheet/assets/braccio-outline.svg b/content/hardware/08.edu/carriers/braccio-carrier/datasheet/assets/braccio-outline.svg similarity index 100% rename from content/hardware/07.edu/carriers/braccio-carrier/datasheet/assets/braccio-outline.svg rename to content/hardware/08.edu/carriers/braccio-carrier/datasheet/assets/braccio-outline.svg diff --git a/content/hardware/07.edu/carriers/braccio-carrier/datasheet/assets/braccio-pinout.png b/content/hardware/08.edu/carriers/braccio-carrier/datasheet/assets/braccio-pinout.png similarity index 100% rename from content/hardware/07.edu/carriers/braccio-carrier/datasheet/assets/braccio-pinout.png rename to content/hardware/08.edu/carriers/braccio-carrier/datasheet/assets/braccio-pinout.png diff --git a/content/hardware/07.edu/carriers/braccio-carrier/datasheet/assets/featured.png b/content/hardware/08.edu/carriers/braccio-carrier/datasheet/assets/featured.png similarity index 100% rename from content/hardware/07.edu/carriers/braccio-carrier/datasheet/assets/featured.png rename to content/hardware/08.edu/carriers/braccio-carrier/datasheet/assets/featured.png diff --git a/content/hardware/07.edu/carriers/braccio-carrier/datasheet/datasheet.md b/content/hardware/08.edu/carriers/braccio-carrier/datasheet/datasheet.md similarity index 100% rename from content/hardware/07.edu/carriers/braccio-carrier/datasheet/datasheet.md rename to content/hardware/08.edu/carriers/braccio-carrier/datasheet/datasheet.md diff --git a/content/hardware/07.edu/carriers/braccio-carrier/downloads/ABX00032-dxf.zip b/content/hardware/08.edu/carriers/braccio-carrier/downloads/ABX00032-dxf.zip similarity index 100% rename from content/hardware/07.edu/carriers/braccio-carrier/downloads/ABX00032-dxf.zip rename to content/hardware/08.edu/carriers/braccio-carrier/downloads/ABX00032-dxf.zip diff --git a/content/hardware/07.edu/carriers/braccio-carrier/downloads/ABX00032-fritzing.fzpz b/content/hardware/08.edu/carriers/braccio-carrier/downloads/ABX00032-fritzing.fzpz similarity index 100% rename from content/hardware/07.edu/carriers/braccio-carrier/downloads/ABX00032-fritzing.fzpz rename to content/hardware/08.edu/carriers/braccio-carrier/downloads/ABX00032-fritzing.fzpz diff --git a/content/hardware/07.edu/carriers/braccio-carrier/downloads/ABX00032-full-pinout.pdf b/content/hardware/08.edu/carriers/braccio-carrier/downloads/ABX00032-full-pinout.pdf similarity index 100% rename from content/hardware/07.edu/carriers/braccio-carrier/downloads/ABX00032-full-pinout.pdf rename to content/hardware/08.edu/carriers/braccio-carrier/downloads/ABX00032-full-pinout.pdf diff --git a/content/hardware/07.edu/carriers/braccio-carrier/downloads/ABX00032-schematics.pdf b/content/hardware/08.edu/carriers/braccio-carrier/downloads/ABX00032-schematics.pdf similarity index 100% rename from content/hardware/07.edu/carriers/braccio-carrier/downloads/ABX00032-schematics.pdf rename to content/hardware/08.edu/carriers/braccio-carrier/downloads/ABX00032-schematics.pdf diff --git a/content/hardware/07.edu/carriers/braccio-carrier/downloads/ABX00032-stand-stl.zip b/content/hardware/08.edu/carriers/braccio-carrier/downloads/ABX00032-stand-stl.zip similarity index 100% rename from content/hardware/07.edu/carriers/braccio-carrier/downloads/ABX00032-stand-stl.zip rename to content/hardware/08.edu/carriers/braccio-carrier/downloads/ABX00032-stand-stl.zip diff --git a/content/hardware/07.edu/carriers/braccio-carrier/downloads/ABX00032-step.zip b/content/hardware/08.edu/carriers/braccio-carrier/downloads/ABX00032-step.zip similarity index 100% rename from content/hardware/07.edu/carriers/braccio-carrier/downloads/ABX00032-step.zip rename to content/hardware/08.edu/carriers/braccio-carrier/downloads/ABX00032-step.zip diff --git a/content/hardware/07.edu/carriers/braccio-carrier/essentials.md b/content/hardware/08.edu/carriers/braccio-carrier/essentials.md similarity index 100% rename from content/hardware/07.edu/carriers/braccio-carrier/essentials.md rename to content/hardware/08.edu/carriers/braccio-carrier/essentials.md diff --git a/content/hardware/07.edu/carriers/braccio-carrier/features.md b/content/hardware/08.edu/carriers/braccio-carrier/features.md similarity index 100% rename from content/hardware/07.edu/carriers/braccio-carrier/features.md rename to content/hardware/08.edu/carriers/braccio-carrier/features.md diff --git a/content/hardware/07.edu/carriers/braccio-carrier/image.svg b/content/hardware/08.edu/carriers/braccio-carrier/image.svg similarity index 100% rename from content/hardware/07.edu/carriers/braccio-carrier/image.svg rename to content/hardware/08.edu/carriers/braccio-carrier/image.svg diff --git a/content/hardware/07.edu/carriers/braccio-carrier/interactive/ABX00032-pinout.png b/content/hardware/08.edu/carriers/braccio-carrier/interactive/ABX00032-pinout.png similarity index 100% rename from content/hardware/07.edu/carriers/braccio-carrier/interactive/ABX00032-pinout.png rename to content/hardware/08.edu/carriers/braccio-carrier/interactive/ABX00032-pinout.png diff --git a/content/hardware/07.edu/carriers/braccio-carrier/product.md b/content/hardware/08.edu/carriers/braccio-carrier/product.md similarity index 100% rename from content/hardware/07.edu/carriers/braccio-carrier/product.md rename to content/hardware/08.edu/carriers/braccio-carrier/product.md diff --git a/content/hardware/07.edu/carriers/braccio-carrier/tech-specs.md b/content/hardware/08.edu/carriers/braccio-carrier/tech-specs.md similarity index 100% rename from content/hardware/07.edu/carriers/braccio-carrier/tech-specs.md rename to content/hardware/08.edu/carriers/braccio-carrier/tech-specs.md diff --git a/content/hardware/07.edu/carriers/braccio-carrier/tech-specs.yml b/content/hardware/08.edu/carriers/braccio-carrier/tech-specs.yml similarity index 100% rename from content/hardware/07.edu/carriers/braccio-carrier/tech-specs.yml rename to content/hardware/08.edu/carriers/braccio-carrier/tech-specs.yml diff --git a/content/hardware/07.edu/carriers/category.md b/content/hardware/08.edu/carriers/category.md similarity index 100% rename from content/hardware/07.edu/carriers/category.md rename to content/hardware/08.edu/carriers/category.md diff --git a/content/hardware/07.edu/family.md b/content/hardware/08.edu/family.md similarity index 100% rename from content/hardware/07.edu/family.md rename to content/hardware/08.edu/family.md diff --git a/content/hardware/07.edu/image-480.png b/content/hardware/08.edu/image-480.png similarity index 100% rename from content/hardware/07.edu/image-480.png rename to content/hardware/08.edu/image-480.png diff --git a/content/hardware/07.edu/image.png b/content/hardware/08.edu/image.png similarity index 100% rename from content/hardware/07.edu/image.png rename to content/hardware/08.edu/image.png diff --git a/content/hardware/08.kits/family.md b/content/hardware/09.kits/family.md similarity index 100% rename from content/hardware/08.kits/family.md rename to content/hardware/09.kits/family.md diff --git a/content/hardware/08.kits/image-480.png b/content/hardware/09.kits/image-480.png similarity index 100% rename from content/hardware/08.kits/image-480.png rename to content/hardware/09.kits/image-480.png diff --git a/content/hardware/08.kits/image.png b/content/hardware/09.kits/image.png similarity index 100% rename from content/hardware/08.kits/image.png rename to content/hardware/09.kits/image.png diff --git a/content/hardware/08.kits/maker/category.md b/content/hardware/09.kits/maker/category.md similarity index 100% rename from content/hardware/08.kits/maker/category.md rename to content/hardware/09.kits/maker/category.md diff --git a/content/hardware/08.kits/maker/plant-watering-kit/compatibility.yml b/content/hardware/09.kits/maker/iot-bundle/compatibility.yml similarity index 100% rename from content/hardware/08.kits/maker/plant-watering-kit/compatibility.yml rename to content/hardware/09.kits/maker/iot-bundle/compatibility.yml diff --git a/content/hardware/08.kits/maker/iot-bundle/features.md b/content/hardware/09.kits/maker/iot-bundle/features.md similarity index 96% rename from content/hardware/08.kits/maker/iot-bundle/features.md rename to content/hardware/09.kits/maker/iot-bundle/features.md index 5264bb7fd4..a8ac425767 100644 --- a/content/hardware/08.kits/maker/iot-bundle/features.md +++ b/content/hardware/09.kits/maker/iot-bundle/features.md @@ -1,47 +1,47 @@ - - -The Arduino IoT Bundle includes 5 step by step tutorials that will get you started with the components in the bundle. They are found just below: - - - - - - - - - Create a pillow that sends your love with the help of the Arduino IoT Cloud! - - - - - - - Create a Puzzle Box with the help of the Arduino IoT Cloud! - - - - - - - Train your cat with the help of the Arduino IoT Cloud! - - - - - - - Create a desktop pet with the help of the Arduino IoT Cloud! - - - - - - - Create a plant communicator with the help of the Arduino IoT Cloud! - - - - - - - + + +The Arduino IoT Bundle includes 5 step by step tutorials that will get you started with the components in the bundle. They are found just below: + + + + + + + + + Create a pillow that sends your love with the help of the Arduino IoT Cloud! + + + + + + + Create a Puzzle Box with the help of the Arduino IoT Cloud! + + + + + + + Train your cat with the help of the Arduino IoT Cloud! + + + + + + + Create a desktop pet with the help of the Arduino IoT Cloud! + + + + + + + Create a plant communicator with the help of the Arduino IoT Cloud! + + + + + + + diff --git a/content/hardware/08.kits/maker/iot-bundle/image.svg b/content/hardware/09.kits/maker/iot-bundle/image.svg similarity index 100% rename from content/hardware/08.kits/maker/iot-bundle/image.svg rename to content/hardware/09.kits/maker/iot-bundle/image.svg diff --git a/content/hardware/08.kits/maker/iot-bundle/product.md b/content/hardware/09.kits/maker/iot-bundle/product.md similarity index 98% rename from content/hardware/08.kits/maker/iot-bundle/product.md rename to content/hardware/09.kits/maker/iot-bundle/product.md index 8504323444..614feee67f 100644 --- a/content/hardware/08.kits/maker/iot-bundle/product.md +++ b/content/hardware/09.kits/maker/iot-bundle/product.md @@ -1,6 +1,6 @@ ---- -title: IoT Bundle -url_shop: https://store.arduino.cc/iot-bundle ---- - +--- +title: IoT Bundle +url_shop: https://store.arduino.cc/iot-bundle +--- + Arduino IoT Bundle allows you to build your next smart project. Ever wanted an automated house? Or a smart garden? Well, now it’s easy with the Arduino IoT Cloud compatible boards. It means: you can connect devices, visualize data, control and share your projects from anywhere in the world. Whether you’re a beginner or a pro, we have a wide range of plans to make sure you get the features you need. \ No newline at end of file diff --git a/content/hardware/08.kits/maker/iot-bundle/tech-specs.md b/content/hardware/09.kits/maker/iot-bundle/tech-specs.md similarity index 100% rename from content/hardware/08.kits/maker/iot-bundle/tech-specs.md rename to content/hardware/09.kits/maker/iot-bundle/tech-specs.md diff --git a/content/hardware/08.kits/maker/iot-bundle/tech-specs.yml b/content/hardware/09.kits/maker/iot-bundle/tech-specs.yml similarity index 96% rename from content/hardware/08.kits/maker/iot-bundle/tech-specs.yml rename to content/hardware/09.kits/maker/iot-bundle/tech-specs.yml index 81e760cbb9..4ef764764b 100644 --- a/content/hardware/08.kits/maker/iot-bundle/tech-specs.yml +++ b/content/hardware/09.kits/maker/iot-bundle/tech-specs.yml @@ -1,33 +1,33 @@ -Kit: - Name: Arduino® IoT Bundle - SKU: AKX00042 -Components: - Arduino Nano RP2040 Connect: 1x - micro USB cable: 1x - 400-point breadboard: 1x - solid-core jumper wires: 70x - stranded jumper wire: 2x - phototransistors: 6x - potentiometers (10k ohm): 3x - pushbuttons: 10x - temperature sensor (TMP36): 1x - tilt sensor: 1x - alphanumeric LCD (16 x 2 characters): 1x - bright white: 1x - LEDs (1 RGB, 8 red, 8 green, 8 yellow, 3 blue): 28x - small DC motor (6/9V): 1x - small servo motor: 1x - piezo capsule (PKM17EPP-4001-B0): 1x - H-bridge motor driver (L293D): 1x - optocouplers (4N35): 1x - MOSFET transistors (IRF520): 2x - capacitors (100uF): 5x - diodes (1N4007): 5x - male pin strip (40 x 1): 1x - resistors (220 ohm): 20x - resistors (560 ohm): 5x - resistors (1k ohm): 5x - resistors (4.7k ohm): 5x - resistors (10k ohm): 20x - resistors (1M ohm): 5x - resistors (10M ohm): 5x +Kit: + Name: Arduino® IoT Bundle + SKU: AKX00042 +Components: + Arduino Nano RP2040 Connect: 1x + micro USB cable: 1x + 400-point breadboard: 1x + solid-core jumper wires: 70x + stranded jumper wire: 2x + phototransistors: 6x + potentiometers (10k ohm): 3x + pushbuttons: 10x + temperature sensor (TMP36): 1x + tilt sensor: 1x + alphanumeric LCD (16 x 2 characters): 1x + bright white: 1x + LEDs (1 RGB, 8 red, 8 green, 8 yellow, 3 blue): 28x + small DC motor (6/9V): 1x + small servo motor: 1x + piezo capsule (PKM17EPP-4001-B0): 1x + H-bridge motor driver (L293D): 1x + optocouplers (4N35): 1x + MOSFET transistors (IRF520): 2x + capacitors (100uF): 5x + diodes (1N4007): 5x + male pin strip (40 x 1): 1x + resistors (220 ohm): 20x + resistors (560 ohm): 5x + resistors (1k ohm): 5x + resistors (4.7k ohm): 5x + resistors (10k ohm): 20x + resistors (1M ohm): 5x + resistors (10M ohm): 5x diff --git a/content/hardware/08.kits/maker/iot-bundle/tutorials/i-love-you-pillow/assets/_ypE8fl7Ln6.png b/content/hardware/09.kits/maker/iot-bundle/tutorials/i-love-you-pillow/assets/_ypE8fl7Ln6.png similarity index 100% rename from content/hardware/08.kits/maker/iot-bundle/tutorials/i-love-you-pillow/assets/_ypE8fl7Ln6.png rename to content/hardware/09.kits/maker/iot-bundle/tutorials/i-love-you-pillow/assets/_ypE8fl7Ln6.png diff --git a/content/hardware/08.kits/maker/iot-bundle/tutorials/i-love-you-pillow/assets/circuit_tLcnUy2ifl.png b/content/hardware/09.kits/maker/iot-bundle/tutorials/i-love-you-pillow/assets/circuit_tLcnUy2ifl.png similarity index 100% rename from content/hardware/08.kits/maker/iot-bundle/tutorials/i-love-you-pillow/assets/circuit_tLcnUy2ifl.png rename to content/hardware/09.kits/maker/iot-bundle/tutorials/i-love-you-pillow/assets/circuit_tLcnUy2ifl.png diff --git a/content/hardware/08.kits/maker/iot-bundle/tutorials/i-love-you-pillow/assets/love-you-pillow-01_VoyWPl8L6l.gif b/content/hardware/09.kits/maker/iot-bundle/tutorials/i-love-you-pillow/assets/love-you-pillow-01_VoyWPl8L6l.gif similarity index 100% rename from content/hardware/08.kits/maker/iot-bundle/tutorials/i-love-you-pillow/assets/love-you-pillow-01_VoyWPl8L6l.gif rename to content/hardware/09.kits/maker/iot-bundle/tutorials/i-love-you-pillow/assets/love-you-pillow-01_VoyWPl8L6l.gif diff --git a/content/hardware/08.kits/maker/iot-bundle/tutorials/i-love-you-pillow/assets/love-you-pillow-02_ydUsouV4bl.gif b/content/hardware/09.kits/maker/iot-bundle/tutorials/i-love-you-pillow/assets/love-you-pillow-02_ydUsouV4bl.gif similarity index 100% rename from content/hardware/08.kits/maker/iot-bundle/tutorials/i-love-you-pillow/assets/love-you-pillow-02_ydUsouV4bl.gif rename to content/hardware/09.kits/maker/iot-bundle/tutorials/i-love-you-pillow/assets/love-you-pillow-02_ydUsouV4bl.gif diff --git a/content/hardware/08.kits/maker/iot-bundle/tutorials/i-love-you-pillow/assets/pillow2-cover_eWFrQi0MOT.png b/content/hardware/09.kits/maker/iot-bundle/tutorials/i-love-you-pillow/assets/pillow2-cover_eWFrQi0MOT.png similarity index 100% rename from content/hardware/08.kits/maker/iot-bundle/tutorials/i-love-you-pillow/assets/pillow2-cover_eWFrQi0MOT.png rename to content/hardware/09.kits/maker/iot-bundle/tutorials/i-love-you-pillow/assets/pillow2-cover_eWFrQi0MOT.png diff --git a/content/hardware/08.kits/maker/iot-bundle/tutorials/i-love-you-pillow/assets/screenshot_2022-03-30_at_14_26_54_stYUq5y7c2.png b/content/hardware/09.kits/maker/iot-bundle/tutorials/i-love-you-pillow/assets/screenshot_2022-03-30_at_14_26_54_stYUq5y7c2.png similarity index 100% rename from content/hardware/08.kits/maker/iot-bundle/tutorials/i-love-you-pillow/assets/screenshot_2022-03-30_at_14_26_54_stYUq5y7c2.png rename to content/hardware/09.kits/maker/iot-bundle/tutorials/i-love-you-pillow/assets/screenshot_2022-03-30_at_14_26_54_stYUq5y7c2.png diff --git a/content/hardware/08.kits/maker/iot-bundle/tutorials/i-love-you-pillow/assets/screenshot_2022-11-23_140745_adGbm9cDej.png b/content/hardware/09.kits/maker/iot-bundle/tutorials/i-love-you-pillow/assets/screenshot_2022-11-23_140745_adGbm9cDej.png similarity index 100% rename from content/hardware/08.kits/maker/iot-bundle/tutorials/i-love-you-pillow/assets/screenshot_2022-11-23_140745_adGbm9cDej.png rename to content/hardware/09.kits/maker/iot-bundle/tutorials/i-love-you-pillow/assets/screenshot_2022-11-23_140745_adGbm9cDej.png diff --git a/content/hardware/08.kits/maker/iot-bundle/tutorials/i-love-you-pillow/assets/template_overview.png b/content/hardware/09.kits/maker/iot-bundle/tutorials/i-love-you-pillow/assets/template_overview.png similarity index 100% rename from content/hardware/08.kits/maker/iot-bundle/tutorials/i-love-you-pillow/assets/template_overview.png rename to content/hardware/09.kits/maker/iot-bundle/tutorials/i-love-you-pillow/assets/template_overview.png diff --git a/content/hardware/08.kits/maker/iot-bundle/tutorials/i-love-you-pillow/content.md b/content/hardware/09.kits/maker/iot-bundle/tutorials/i-love-you-pillow/content.md similarity index 100% rename from content/hardware/08.kits/maker/iot-bundle/tutorials/i-love-you-pillow/content.md rename to content/hardware/09.kits/maker/iot-bundle/tutorials/i-love-you-pillow/content.md diff --git a/content/hardware/08.kits/maker/iot-bundle/tutorials/i-love-you-pillow/hero-banner.png b/content/hardware/09.kits/maker/iot-bundle/tutorials/i-love-you-pillow/hero-banner.png similarity index 100% rename from content/hardware/08.kits/maker/iot-bundle/tutorials/i-love-you-pillow/hero-banner.png rename to content/hardware/09.kits/maker/iot-bundle/tutorials/i-love-you-pillow/hero-banner.png diff --git a/content/hardware/08.kits/maker/iot-bundle/tutorials/pavlovs-cat/assets/_mV3ZK8zeAh.png b/content/hardware/09.kits/maker/iot-bundle/tutorials/pavlovs-cat/assets/_mV3ZK8zeAh.png similarity index 100% rename from content/hardware/08.kits/maker/iot-bundle/tutorials/pavlovs-cat/assets/_mV3ZK8zeAh.png rename to content/hardware/09.kits/maker/iot-bundle/tutorials/pavlovs-cat/assets/_mV3ZK8zeAh.png diff --git a/content/hardware/08.kits/maker/iot-bundle/tutorials/pavlovs-cat/assets/gif-cat_vCx1OHLrzl.gif b/content/hardware/09.kits/maker/iot-bundle/tutorials/pavlovs-cat/assets/gif-cat_vCx1OHLrzl.gif similarity index 100% rename from content/hardware/08.kits/maker/iot-bundle/tutorials/pavlovs-cat/assets/gif-cat_vCx1OHLrzl.gif rename to content/hardware/09.kits/maker/iot-bundle/tutorials/pavlovs-cat/assets/gif-cat_vCx1OHLrzl.gif diff --git a/content/hardware/08.kits/maker/iot-bundle/tutorials/pavlovs-cat/assets/light_rp2040_w373rVgQAw.png b/content/hardware/09.kits/maker/iot-bundle/tutorials/pavlovs-cat/assets/light_rp2040_w373rVgQAw.png similarity index 100% rename from content/hardware/08.kits/maker/iot-bundle/tutorials/pavlovs-cat/assets/light_rp2040_w373rVgQAw.png rename to content/hardware/09.kits/maker/iot-bundle/tutorials/pavlovs-cat/assets/light_rp2040_w373rVgQAw.png diff --git a/content/hardware/08.kits/maker/iot-bundle/tutorials/pavlovs-cat/assets/palvov-cat-01_FHBOz5Z3MA.gif b/content/hardware/09.kits/maker/iot-bundle/tutorials/pavlovs-cat/assets/palvov-cat-01_FHBOz5Z3MA.gif similarity index 100% rename from content/hardware/08.kits/maker/iot-bundle/tutorials/pavlovs-cat/assets/palvov-cat-01_FHBOz5Z3MA.gif rename to content/hardware/09.kits/maker/iot-bundle/tutorials/pavlovs-cat/assets/palvov-cat-01_FHBOz5Z3MA.gif diff --git a/content/hardware/08.kits/maker/iot-bundle/tutorials/pavlovs-cat/assets/palvov-cat-02.gif b/content/hardware/09.kits/maker/iot-bundle/tutorials/pavlovs-cat/assets/palvov-cat-02.gif similarity index 100% rename from content/hardware/08.kits/maker/iot-bundle/tutorials/pavlovs-cat/assets/palvov-cat-02.gif rename to content/hardware/09.kits/maker/iot-bundle/tutorials/pavlovs-cat/assets/palvov-cat-02.gif diff --git a/content/hardware/08.kits/maker/iot-bundle/tutorials/pavlovs-cat/assets/palvov-cat-03_EJSoVjN9qB.gif b/content/hardware/09.kits/maker/iot-bundle/tutorials/pavlovs-cat/assets/palvov-cat-03_EJSoVjN9qB.gif similarity index 100% rename from content/hardware/08.kits/maker/iot-bundle/tutorials/pavlovs-cat/assets/palvov-cat-03_EJSoVjN9qB.gif rename to content/hardware/09.kits/maker/iot-bundle/tutorials/pavlovs-cat/assets/palvov-cat-03_EJSoVjN9qB.gif diff --git a/content/hardware/08.kits/maker/iot-bundle/tutorials/pavlovs-cat/assets/piezo_buzzer_rp2040_whR92Z3Wgx.png b/content/hardware/09.kits/maker/iot-bundle/tutorials/pavlovs-cat/assets/piezo_buzzer_rp2040_whR92Z3Wgx.png similarity index 100% rename from content/hardware/08.kits/maker/iot-bundle/tutorials/pavlovs-cat/assets/piezo_buzzer_rp2040_whR92Z3Wgx.png rename to content/hardware/09.kits/maker/iot-bundle/tutorials/pavlovs-cat/assets/piezo_buzzer_rp2040_whR92Z3Wgx.png diff --git a/content/hardware/08.kits/maker/iot-bundle/tutorials/pavlovs-cat/assets/screenshot_2022-11-23_141459_JVW8zmmeP0.png b/content/hardware/09.kits/maker/iot-bundle/tutorials/pavlovs-cat/assets/screenshot_2022-11-23_141459_JVW8zmmeP0.png similarity index 100% rename from content/hardware/08.kits/maker/iot-bundle/tutorials/pavlovs-cat/assets/screenshot_2022-11-23_141459_JVW8zmmeP0.png rename to content/hardware/09.kits/maker/iot-bundle/tutorials/pavlovs-cat/assets/screenshot_2022-11-23_141459_JVW8zmmeP0.png diff --git a/content/hardware/08.kits/maker/iot-bundle/tutorials/pavlovs-cat/assets/servo_motor_rp2040_PAcv0Yejb2.png b/content/hardware/09.kits/maker/iot-bundle/tutorials/pavlovs-cat/assets/servo_motor_rp2040_PAcv0Yejb2.png similarity index 100% rename from content/hardware/08.kits/maker/iot-bundle/tutorials/pavlovs-cat/assets/servo_motor_rp2040_PAcv0Yejb2.png rename to content/hardware/09.kits/maker/iot-bundle/tutorials/pavlovs-cat/assets/servo_motor_rp2040_PAcv0Yejb2.png diff --git a/content/hardware/08.kits/maker/iot-bundle/tutorials/pavlovs-cat/assets/template_overview.png b/content/hardware/09.kits/maker/iot-bundle/tutorials/pavlovs-cat/assets/template_overview.png similarity index 100% rename from content/hardware/08.kits/maker/iot-bundle/tutorials/pavlovs-cat/assets/template_overview.png rename to content/hardware/09.kits/maker/iot-bundle/tutorials/pavlovs-cat/assets/template_overview.png diff --git a/content/hardware/08.kits/maker/iot-bundle/tutorials/pavlovs-cat/content.md b/content/hardware/09.kits/maker/iot-bundle/tutorials/pavlovs-cat/content.md similarity index 100% rename from content/hardware/08.kits/maker/iot-bundle/tutorials/pavlovs-cat/content.md rename to content/hardware/09.kits/maker/iot-bundle/tutorials/pavlovs-cat/content.md diff --git a/content/hardware/08.kits/maker/iot-bundle/tutorials/pavlovs-cat/hero-banner.png b/content/hardware/09.kits/maker/iot-bundle/tutorials/pavlovs-cat/hero-banner.png similarity index 100% rename from content/hardware/08.kits/maker/iot-bundle/tutorials/pavlovs-cat/hero-banner.png rename to content/hardware/09.kits/maker/iot-bundle/tutorials/pavlovs-cat/hero-banner.png diff --git a/content/hardware/08.kits/maker/iot-bundle/tutorials/plant-communicator/assets/_rdaslUwR6h.png b/content/hardware/09.kits/maker/iot-bundle/tutorials/plant-communicator/assets/_rdaslUwR6h.png similarity index 100% rename from content/hardware/08.kits/maker/iot-bundle/tutorials/plant-communicator/assets/_rdaslUwR6h.png rename to content/hardware/09.kits/maker/iot-bundle/tutorials/plant-communicator/assets/_rdaslUwR6h.png diff --git a/content/hardware/08.kits/maker/iot-bundle/tutorials/plant-communicator/assets/diy-soil-moisture-rp2040_q2RlMGdgl9.png b/content/hardware/09.kits/maker/iot-bundle/tutorials/plant-communicator/assets/diy-soil-moisture-rp2040_q2RlMGdgl9.png similarity index 100% rename from content/hardware/08.kits/maker/iot-bundle/tutorials/plant-communicator/assets/diy-soil-moisture-rp2040_q2RlMGdgl9.png rename to content/hardware/09.kits/maker/iot-bundle/tutorials/plant-communicator/assets/diy-soil-moisture-rp2040_q2RlMGdgl9.png diff --git a/content/hardware/08.kits/maker/iot-bundle/tutorials/plant-communicator/assets/light__temperature_sensor_rp2040_bfbwQp7XjU.png b/content/hardware/09.kits/maker/iot-bundle/tutorials/plant-communicator/assets/light__temperature_sensor_rp2040_bfbwQp7XjU.png similarity index 100% rename from content/hardware/08.kits/maker/iot-bundle/tutorials/plant-communicator/assets/light__temperature_sensor_rp2040_bfbwQp7XjU.png rename to content/hardware/09.kits/maker/iot-bundle/tutorials/plant-communicator/assets/light__temperature_sensor_rp2040_bfbwQp7XjU.png diff --git a/content/hardware/08.kits/maker/iot-bundle/tutorials/plant-communicator/assets/plant_communicator_01.gif b/content/hardware/09.kits/maker/iot-bundle/tutorials/plant-communicator/assets/plant_communicator_01.gif similarity index 100% rename from content/hardware/08.kits/maker/iot-bundle/tutorials/plant-communicator/assets/plant_communicator_01.gif rename to content/hardware/09.kits/maker/iot-bundle/tutorials/plant-communicator/assets/plant_communicator_01.gif diff --git a/content/hardware/08.kits/maker/iot-bundle/tutorials/plant-communicator/assets/plant_communicator_03__2_.gif b/content/hardware/09.kits/maker/iot-bundle/tutorials/plant-communicator/assets/plant_communicator_03__2_.gif similarity index 100% rename from content/hardware/08.kits/maker/iot-bundle/tutorials/plant-communicator/assets/plant_communicator_03__2_.gif rename to content/hardware/09.kits/maker/iot-bundle/tutorials/plant-communicator/assets/plant_communicator_03__2_.gif diff --git a/content/hardware/08.kits/maker/iot-bundle/tutorials/plant-communicator/assets/plant_communicator_04.gif b/content/hardware/09.kits/maker/iot-bundle/tutorials/plant-communicator/assets/plant_communicator_04.gif similarity index 100% rename from content/hardware/08.kits/maker/iot-bundle/tutorials/plant-communicator/assets/plant_communicator_04.gif rename to content/hardware/09.kits/maker/iot-bundle/tutorials/plant-communicator/assets/plant_communicator_04.gif diff --git a/content/hardware/08.kits/maker/iot-bundle/tutorials/plant-communicator/assets/screenshot_2022-11-23_141037_Q9gBcgrkER.png b/content/hardware/09.kits/maker/iot-bundle/tutorials/plant-communicator/assets/screenshot_2022-11-23_141037_Q9gBcgrkER.png similarity index 100% rename from content/hardware/08.kits/maker/iot-bundle/tutorials/plant-communicator/assets/screenshot_2022-11-23_141037_Q9gBcgrkER.png rename to content/hardware/09.kits/maker/iot-bundle/tutorials/plant-communicator/assets/screenshot_2022-11-23_141037_Q9gBcgrkER.png diff --git a/content/hardware/08.kits/maker/iot-bundle/tutorials/plant-communicator/assets/template_overview.png b/content/hardware/09.kits/maker/iot-bundle/tutorials/plant-communicator/assets/template_overview.png similarity index 100% rename from content/hardware/08.kits/maker/iot-bundle/tutorials/plant-communicator/assets/template_overview.png rename to content/hardware/09.kits/maker/iot-bundle/tutorials/plant-communicator/assets/template_overview.png diff --git a/content/hardware/08.kits/maker/iot-bundle/tutorials/plant-communicator/content.md b/content/hardware/09.kits/maker/iot-bundle/tutorials/plant-communicator/content.md similarity index 100% rename from content/hardware/08.kits/maker/iot-bundle/tutorials/plant-communicator/content.md rename to content/hardware/09.kits/maker/iot-bundle/tutorials/plant-communicator/content.md diff --git a/content/hardware/08.kits/maker/iot-bundle/tutorials/plant-communicator/hero-banner.png b/content/hardware/09.kits/maker/iot-bundle/tutorials/plant-communicator/hero-banner.png similarity index 100% rename from content/hardware/08.kits/maker/iot-bundle/tutorials/plant-communicator/hero-banner.png rename to content/hardware/09.kits/maker/iot-bundle/tutorials/plant-communicator/hero-banner.png diff --git a/content/hardware/08.kits/maker/iot-bundle/tutorials/puzzlebox/assets/_VbBUKNXj0o.png b/content/hardware/09.kits/maker/iot-bundle/tutorials/puzzlebox/assets/_VbBUKNXj0o.png similarity index 100% rename from content/hardware/08.kits/maker/iot-bundle/tutorials/puzzlebox/assets/_VbBUKNXj0o.png rename to content/hardware/09.kits/maker/iot-bundle/tutorials/puzzlebox/assets/_VbBUKNXj0o.png diff --git a/content/hardware/08.kits/maker/iot-bundle/tutorials/puzzlebox/assets/cloudinstructions_rp2040_0AMlQHeGHs.gif b/content/hardware/09.kits/maker/iot-bundle/tutorials/puzzlebox/assets/cloudinstructions_rp2040_0AMlQHeGHs.gif similarity index 100% rename from content/hardware/08.kits/maker/iot-bundle/tutorials/puzzlebox/assets/cloudinstructions_rp2040_0AMlQHeGHs.gif rename to content/hardware/09.kits/maker/iot-bundle/tutorials/puzzlebox/assets/cloudinstructions_rp2040_0AMlQHeGHs.gif diff --git a/content/hardware/08.kits/maker/iot-bundle/tutorials/puzzlebox/assets/lcd_part_rp2040_wOrq2EKGuO.png b/content/hardware/09.kits/maker/iot-bundle/tutorials/puzzlebox/assets/lcd_part_rp2040_wOrq2EKGuO.png similarity index 100% rename from content/hardware/08.kits/maker/iot-bundle/tutorials/puzzlebox/assets/lcd_part_rp2040_wOrq2EKGuO.png rename to content/hardware/09.kits/maker/iot-bundle/tutorials/puzzlebox/assets/lcd_part_rp2040_wOrq2EKGuO.png diff --git a/content/hardware/08.kits/maker/iot-bundle/tutorials/puzzlebox/assets/piezo_buzzer_comeplete_rp2040_JAUtOjyKq1.png b/content/hardware/09.kits/maker/iot-bundle/tutorials/puzzlebox/assets/piezo_buzzer_comeplete_rp2040_JAUtOjyKq1.png similarity index 100% rename from content/hardware/08.kits/maker/iot-bundle/tutorials/puzzlebox/assets/piezo_buzzer_comeplete_rp2040_JAUtOjyKq1.png rename to content/hardware/09.kits/maker/iot-bundle/tutorials/puzzlebox/assets/piezo_buzzer_comeplete_rp2040_JAUtOjyKq1.png diff --git a/content/hardware/08.kits/maker/iot-bundle/tutorials/puzzlebox/assets/piezo_buzzer_part_rp2040_iaPHtGSH0X.png b/content/hardware/09.kits/maker/iot-bundle/tutorials/puzzlebox/assets/piezo_buzzer_part_rp2040_iaPHtGSH0X.png similarity index 100% rename from content/hardware/08.kits/maker/iot-bundle/tutorials/puzzlebox/assets/piezo_buzzer_part_rp2040_iaPHtGSH0X.png rename to content/hardware/09.kits/maker/iot-bundle/tutorials/puzzlebox/assets/piezo_buzzer_part_rp2040_iaPHtGSH0X.png diff --git a/content/hardware/08.kits/maker/iot-bundle/tutorials/puzzlebox/assets/potentiometer_part_rp2040_q8hHfs8AIS.png b/content/hardware/09.kits/maker/iot-bundle/tutorials/puzzlebox/assets/potentiometer_part_rp2040_q8hHfs8AIS.png similarity index 100% rename from content/hardware/08.kits/maker/iot-bundle/tutorials/puzzlebox/assets/potentiometer_part_rp2040_q8hHfs8AIS.png rename to content/hardware/09.kits/maker/iot-bundle/tutorials/puzzlebox/assets/potentiometer_part_rp2040_q8hHfs8AIS.png diff --git a/content/hardware/08.kits/maker/iot-bundle/tutorials/puzzlebox/assets/puzzlebox_pi0UiMBngP.gif b/content/hardware/09.kits/maker/iot-bundle/tutorials/puzzlebox/assets/puzzlebox_pi0UiMBngP.gif similarity index 100% rename from content/hardware/08.kits/maker/iot-bundle/tutorials/puzzlebox/assets/puzzlebox_pi0UiMBngP.gif rename to content/hardware/09.kits/maker/iot-bundle/tutorials/puzzlebox/assets/puzzlebox_pi0UiMBngP.gif diff --git a/content/hardware/08.kits/maker/iot-bundle/tutorials/puzzlebox/assets/rgb_comeplete_rp2040_6AuNMnXduR.png b/content/hardware/09.kits/maker/iot-bundle/tutorials/puzzlebox/assets/rgb_comeplete_rp2040_6AuNMnXduR.png similarity index 100% rename from content/hardware/08.kits/maker/iot-bundle/tutorials/puzzlebox/assets/rgb_comeplete_rp2040_6AuNMnXduR.png rename to content/hardware/09.kits/maker/iot-bundle/tutorials/puzzlebox/assets/rgb_comeplete_rp2040_6AuNMnXduR.png diff --git a/content/hardware/08.kits/maker/iot-bundle/tutorials/puzzlebox/assets/rgb_part_rp2040_4eGOKtRQgk.png b/content/hardware/09.kits/maker/iot-bundle/tutorials/puzzlebox/assets/rgb_part_rp2040_4eGOKtRQgk.png similarity index 100% rename from content/hardware/08.kits/maker/iot-bundle/tutorials/puzzlebox/assets/rgb_part_rp2040_4eGOKtRQgk.png rename to content/hardware/09.kits/maker/iot-bundle/tutorials/puzzlebox/assets/rgb_part_rp2040_4eGOKtRQgk.png diff --git a/content/hardware/08.kits/maker/iot-bundle/tutorials/puzzlebox/assets/rgbled_s82wjxgcnf_1WXt8cDpSj.png b/content/hardware/09.kits/maker/iot-bundle/tutorials/puzzlebox/assets/rgbled_s82wjxgcnf_1WXt8cDpSj.png similarity index 100% rename from content/hardware/08.kits/maker/iot-bundle/tutorials/puzzlebox/assets/rgbled_s82wjxgcnf_1WXt8cDpSj.png rename to content/hardware/09.kits/maker/iot-bundle/tutorials/puzzlebox/assets/rgbled_s82wjxgcnf_1WXt8cDpSj.png diff --git a/content/hardware/08.kits/maker/iot-bundle/tutorials/puzzlebox/assets/safe_combination_Xkek4QBhoy.gif b/content/hardware/09.kits/maker/iot-bundle/tutorials/puzzlebox/assets/safe_combination_Xkek4QBhoy.gif similarity index 100% rename from content/hardware/08.kits/maker/iot-bundle/tutorials/puzzlebox/assets/safe_combination_Xkek4QBhoy.gif rename to content/hardware/09.kits/maker/iot-bundle/tutorials/puzzlebox/assets/safe_combination_Xkek4QBhoy.gif diff --git a/content/hardware/08.kits/maker/iot-bundle/tutorials/puzzlebox/assets/screenshot_2022-11-17_095328_ujTWxb7Xtp.png b/content/hardware/09.kits/maker/iot-bundle/tutorials/puzzlebox/assets/screenshot_2022-11-17_095328_ujTWxb7Xtp.png similarity index 100% rename from content/hardware/08.kits/maker/iot-bundle/tutorials/puzzlebox/assets/screenshot_2022-11-17_095328_ujTWxb7Xtp.png rename to content/hardware/09.kits/maker/iot-bundle/tutorials/puzzlebox/assets/screenshot_2022-11-17_095328_ujTWxb7Xtp.png diff --git a/content/hardware/08.kits/maker/iot-bundle/tutorials/puzzlebox/assets/screenshot_2022-11-23_141306_tsMoI77zJw.png b/content/hardware/09.kits/maker/iot-bundle/tutorials/puzzlebox/assets/screenshot_2022-11-23_141306_tsMoI77zJw.png similarity index 100% rename from content/hardware/08.kits/maker/iot-bundle/tutorials/puzzlebox/assets/screenshot_2022-11-23_141306_tsMoI77zJw.png rename to content/hardware/09.kits/maker/iot-bundle/tutorials/puzzlebox/assets/screenshot_2022-11-23_141306_tsMoI77zJw.png diff --git a/content/hardware/08.kits/maker/iot-bundle/tutorials/puzzlebox/assets/servo_motor_comeplete_rp2040_mXHekbPnRO.png b/content/hardware/09.kits/maker/iot-bundle/tutorials/puzzlebox/assets/servo_motor_comeplete_rp2040_mXHekbPnRO.png similarity index 100% rename from content/hardware/08.kits/maker/iot-bundle/tutorials/puzzlebox/assets/servo_motor_comeplete_rp2040_mXHekbPnRO.png rename to content/hardware/09.kits/maker/iot-bundle/tutorials/puzzlebox/assets/servo_motor_comeplete_rp2040_mXHekbPnRO.png diff --git a/content/hardware/08.kits/maker/iot-bundle/tutorials/puzzlebox/assets/servo_motor_part_rp2040_4ZqZ4C9F5w.png b/content/hardware/09.kits/maker/iot-bundle/tutorials/puzzlebox/assets/servo_motor_part_rp2040_4ZqZ4C9F5w.png similarity index 100% rename from content/hardware/08.kits/maker/iot-bundle/tutorials/puzzlebox/assets/servo_motor_part_rp2040_4ZqZ4C9F5w.png rename to content/hardware/09.kits/maker/iot-bundle/tutorials/puzzlebox/assets/servo_motor_part_rp2040_4ZqZ4C9F5w.png diff --git a/content/hardware/08.kits/maker/iot-bundle/tutorials/puzzlebox/assets/template_overview.png b/content/hardware/09.kits/maker/iot-bundle/tutorials/puzzlebox/assets/template_overview.png similarity index 100% rename from content/hardware/08.kits/maker/iot-bundle/tutorials/puzzlebox/assets/template_overview.png rename to content/hardware/09.kits/maker/iot-bundle/tutorials/puzzlebox/assets/template_overview.png diff --git a/content/hardware/08.kits/maker/iot-bundle/tutorials/puzzlebox/content.md b/content/hardware/09.kits/maker/iot-bundle/tutorials/puzzlebox/content.md similarity index 100% rename from content/hardware/08.kits/maker/iot-bundle/tutorials/puzzlebox/content.md rename to content/hardware/09.kits/maker/iot-bundle/tutorials/puzzlebox/content.md diff --git a/content/hardware/08.kits/maker/iot-bundle/tutorials/puzzlebox/hero-banner.png b/content/hardware/09.kits/maker/iot-bundle/tutorials/puzzlebox/hero-banner.png similarity index 100% rename from content/hardware/08.kits/maker/iot-bundle/tutorials/puzzlebox/hero-banner.png rename to content/hardware/09.kits/maker/iot-bundle/tutorials/puzzlebox/hero-banner.png diff --git a/content/hardware/08.kits/maker/iot-bundle/tutorials/the-nerd/assets/_45dZFAyOab.png b/content/hardware/09.kits/maker/iot-bundle/tutorials/the-nerd/assets/_45dZFAyOab.png similarity index 100% rename from content/hardware/08.kits/maker/iot-bundle/tutorials/the-nerd/assets/_45dZFAyOab.png rename to content/hardware/09.kits/maker/iot-bundle/tutorials/the-nerd/assets/_45dZFAyOab.png diff --git a/content/hardware/08.kits/maker/iot-bundle/tutorials/the-nerd/assets/nerd-cloud-setup_RC5c4S0ASc.gif b/content/hardware/09.kits/maker/iot-bundle/tutorials/the-nerd/assets/nerd-cloud-setup_RC5c4S0ASc.gif similarity index 100% rename from content/hardware/08.kits/maker/iot-bundle/tutorials/the-nerd/assets/nerd-cloud-setup_RC5c4S0ASc.gif rename to content/hardware/09.kits/maker/iot-bundle/tutorials/the-nerd/assets/nerd-cloud-setup_RC5c4S0ASc.gif diff --git a/content/hardware/08.kits/maker/iot-bundle/tutorials/the-nerd/assets/screenshot_2022-11-18_175524_4XRWc1dHYc.png b/content/hardware/09.kits/maker/iot-bundle/tutorials/the-nerd/assets/screenshot_2022-11-18_175524_4XRWc1dHYc.png similarity index 100% rename from content/hardware/08.kits/maker/iot-bundle/tutorials/the-nerd/assets/screenshot_2022-11-18_175524_4XRWc1dHYc.png rename to content/hardware/09.kits/maker/iot-bundle/tutorials/the-nerd/assets/screenshot_2022-11-18_175524_4XRWc1dHYc.png diff --git a/content/hardware/08.kits/maker/iot-bundle/tutorials/the-nerd/assets/template_overview.png b/content/hardware/09.kits/maker/iot-bundle/tutorials/the-nerd/assets/template_overview.png similarity index 100% rename from content/hardware/08.kits/maker/iot-bundle/tutorials/the-nerd/assets/template_overview.png rename to content/hardware/09.kits/maker/iot-bundle/tutorials/the-nerd/assets/template_overview.png diff --git a/content/hardware/08.kits/maker/iot-bundle/tutorials/the-nerd/assets/the_nerd_m3DggOdFBj.gif b/content/hardware/09.kits/maker/iot-bundle/tutorials/the-nerd/assets/the_nerd_m3DggOdFBj.gif similarity index 100% rename from content/hardware/08.kits/maker/iot-bundle/tutorials/the-nerd/assets/the_nerd_m3DggOdFBj.gif rename to content/hardware/09.kits/maker/iot-bundle/tutorials/the-nerd/assets/the_nerd_m3DggOdFBj.gif diff --git a/content/hardware/08.kits/maker/iot-bundle/tutorials/the-nerd/assets/the_nerd_rp2040_dqr7egmpao_ESpsLy8iaq.png b/content/hardware/09.kits/maker/iot-bundle/tutorials/the-nerd/assets/the_nerd_rp2040_dqr7egmpao_ESpsLy8iaq.png similarity index 100% rename from content/hardware/08.kits/maker/iot-bundle/tutorials/the-nerd/assets/the_nerd_rp2040_dqr7egmpao_ESpsLy8iaq.png rename to content/hardware/09.kits/maker/iot-bundle/tutorials/the-nerd/assets/the_nerd_rp2040_dqr7egmpao_ESpsLy8iaq.png diff --git a/content/hardware/08.kits/maker/iot-bundle/tutorials/the-nerd/content.md b/content/hardware/09.kits/maker/iot-bundle/tutorials/the-nerd/content.md similarity index 100% rename from content/hardware/08.kits/maker/iot-bundle/tutorials/the-nerd/content.md rename to content/hardware/09.kits/maker/iot-bundle/tutorials/the-nerd/content.md diff --git a/content/hardware/08.kits/maker/iot-bundle/tutorials/the-nerd/hero-banner.png b/content/hardware/09.kits/maker/iot-bundle/tutorials/the-nerd/hero-banner.png similarity index 100% rename from content/hardware/08.kits/maker/iot-bundle/tutorials/the-nerd/hero-banner.png rename to content/hardware/09.kits/maker/iot-bundle/tutorials/the-nerd/hero-banner.png diff --git a/content/hardware/08.kits/maker/make-your-uno-kit/certifications/Arduino_AKX00037-DoC_CE.pdf b/content/hardware/09.kits/maker/make-your-uno-kit/certifications/Arduino_AKX00037-DoC_CE.pdf similarity index 100% rename from content/hardware/08.kits/maker/make-your-uno-kit/certifications/Arduino_AKX00037-DoC_CE.pdf rename to content/hardware/09.kits/maker/make-your-uno-kit/certifications/Arduino_AKX00037-DoC_CE.pdf diff --git a/content/hardware/08.kits/maker/make-your-uno-kit/compatibility.yml b/content/hardware/09.kits/maker/make-your-uno-kit/compatibility.yml similarity index 94% rename from content/hardware/08.kits/maker/make-your-uno-kit/compatibility.yml rename to content/hardware/09.kits/maker/make-your-uno-kit/compatibility.yml index d9949a33a5..5a204cdaf8 100644 --- a/content/hardware/08.kits/maker/make-your-uno-kit/compatibility.yml +++ b/content/hardware/09.kits/maker/make-your-uno-kit/compatibility.yml @@ -1,10 +1,10 @@ -software: - - arduino-ide - - arduino-cli - - web-editor -hardware: - shields: - - 4-relays-shield - - motor-shield-rev3 - carriers: ~ +software: + - arduino-ide + - arduino-cli + - web-editor +hardware: + shields: + - 4-relays-shield + - motor-shield-rev3 + carriers: ~ boards: ~ \ No newline at end of file diff --git a/content/hardware/08.kits/maker/make-your-uno-kit/datasheet/assets/audioComponentsView.png b/content/hardware/09.kits/maker/make-your-uno-kit/datasheet/assets/audioComponentsView.png similarity index 100% rename from content/hardware/08.kits/maker/make-your-uno-kit/datasheet/assets/audioComponentsView.png rename to content/hardware/09.kits/maker/make-your-uno-kit/datasheet/assets/audioComponentsView.png diff --git a/content/hardware/08.kits/maker/make-your-uno-kit/datasheet/assets/boardOutline.svg b/content/hardware/09.kits/maker/make-your-uno-kit/datasheet/assets/boardOutline.svg similarity index 100% rename from content/hardware/08.kits/maker/make-your-uno-kit/datasheet/assets/boardOutline.svg rename to content/hardware/09.kits/maker/make-your-uno-kit/datasheet/assets/boardOutline.svg diff --git a/content/hardware/08.kits/maker/make-your-uno-kit/datasheet/assets/featured.png b/content/hardware/09.kits/maker/make-your-uno-kit/datasheet/assets/featured.png similarity index 100% rename from content/hardware/08.kits/maker/make-your-uno-kit/datasheet/assets/featured.png rename to content/hardware/09.kits/maker/make-your-uno-kit/datasheet/assets/featured.png diff --git a/content/hardware/08.kits/maker/make-your-uno-kit/datasheet/assets/fusionOutline.svg b/content/hardware/09.kits/maker/make-your-uno-kit/datasheet/assets/fusionOutline.svg similarity index 100% rename from content/hardware/08.kits/maker/make-your-uno-kit/datasheet/assets/fusionOutline.svg rename to content/hardware/09.kits/maker/make-your-uno-kit/datasheet/assets/fusionOutline.svg diff --git a/content/hardware/08.kits/maker/make-your-uno-kit/datasheet/assets/lowAudioSynth.png b/content/hardware/09.kits/maker/make-your-uno-kit/datasheet/assets/lowAudioSynth.png similarity index 100% rename from content/hardware/08.kits/maker/make-your-uno-kit/datasheet/assets/lowAudioSynth.png rename to content/hardware/09.kits/maker/make-your-uno-kit/datasheet/assets/lowAudioSynth.png diff --git a/content/hardware/08.kits/maker/make-your-uno-kit/datasheet/assets/pinout.png b/content/hardware/09.kits/maker/make-your-uno-kit/datasheet/assets/pinout.png similarity index 100% rename from content/hardware/08.kits/maker/make-your-uno-kit/datasheet/assets/pinout.png rename to content/hardware/09.kits/maker/make-your-uno-kit/datasheet/assets/pinout.png diff --git a/content/hardware/08.kits/maker/make-your-uno-kit/datasheet/assets/powerTree.svg b/content/hardware/09.kits/maker/make-your-uno-kit/datasheet/assets/powerTree.svg similarity index 100% rename from content/hardware/08.kits/maker/make-your-uno-kit/datasheet/assets/powerTree.svg rename to content/hardware/09.kits/maker/make-your-uno-kit/datasheet/assets/powerTree.svg diff --git a/content/hardware/08.kits/maker/make-your-uno-kit/datasheet/assets/synthMounted.png b/content/hardware/09.kits/maker/make-your-uno-kit/datasheet/assets/synthMounted.png similarity index 100% rename from content/hardware/08.kits/maker/make-your-uno-kit/datasheet/assets/synthMounted.png rename to content/hardware/09.kits/maker/make-your-uno-kit/datasheet/assets/synthMounted.png diff --git a/content/hardware/08.kits/maker/make-your-uno-kit/datasheet/assets/synthOutline.svg b/content/hardware/09.kits/maker/make-your-uno-kit/datasheet/assets/synthOutline.svg similarity index 100% rename from content/hardware/08.kits/maker/make-your-uno-kit/datasheet/assets/synthOutline.svg rename to content/hardware/09.kits/maker/make-your-uno-kit/datasheet/assets/synthOutline.svg diff --git a/content/hardware/08.kits/maker/make-your-uno-kit/datasheet/assets/synthPotentiometers.svg b/content/hardware/09.kits/maker/make-your-uno-kit/datasheet/assets/synthPotentiometers.svg similarity index 100% rename from content/hardware/08.kits/maker/make-your-uno-kit/datasheet/assets/synthPotentiometers.svg rename to content/hardware/09.kits/maker/make-your-uno-kit/datasheet/assets/synthPotentiometers.svg diff --git a/content/hardware/08.kits/maker/make-your-uno-kit/datasheet/assets/synthTopology.svg b/content/hardware/09.kits/maker/make-your-uno-kit/datasheet/assets/synthTopology.svg similarity index 100% rename from content/hardware/08.kits/maker/make-your-uno-kit/datasheet/assets/synthTopology.svg rename to content/hardware/09.kits/maker/make-your-uno-kit/datasheet/assets/synthTopology.svg diff --git a/content/hardware/08.kits/maker/make-your-uno-kit/datasheet/assets/unoComponentsView.png b/content/hardware/09.kits/maker/make-your-uno-kit/datasheet/assets/unoComponentsView.png similarity index 100% rename from content/hardware/08.kits/maker/make-your-uno-kit/datasheet/assets/unoComponentsView.png rename to content/hardware/09.kits/maker/make-your-uno-kit/datasheet/assets/unoComponentsView.png diff --git a/content/hardware/08.kits/maker/make-your-uno-kit/datasheet/assets/unoOverview.png b/content/hardware/09.kits/maker/make-your-uno-kit/datasheet/assets/unoOverview.png similarity index 100% rename from content/hardware/08.kits/maker/make-your-uno-kit/datasheet/assets/unoOverview.png rename to content/hardware/09.kits/maker/make-your-uno-kit/datasheet/assets/unoOverview.png diff --git a/content/hardware/08.kits/maker/make-your-uno-kit/datasheet/datasheet.md b/content/hardware/09.kits/maker/make-your-uno-kit/datasheet/datasheet.md similarity index 100% rename from content/hardware/08.kits/maker/make-your-uno-kit/datasheet/datasheet.md rename to content/hardware/09.kits/maker/make-your-uno-kit/datasheet/datasheet.md diff --git a/content/hardware/08.kits/maker/make-your-uno-kit/downloads/AKX00037-cad-files.zip b/content/hardware/09.kits/maker/make-your-uno-kit/downloads/AKX00037-cad-files.zip similarity index 100% rename from content/hardware/08.kits/maker/make-your-uno-kit/downloads/AKX00037-cad-files.zip rename to content/hardware/09.kits/maker/make-your-uno-kit/downloads/AKX00037-cad-files.zip diff --git a/content/hardware/08.kits/maker/make-your-uno-kit/downloads/AKX00037-schematics.pdf b/content/hardware/09.kits/maker/make-your-uno-kit/downloads/AKX00037-schematics.pdf similarity index 100% rename from content/hardware/08.kits/maker/make-your-uno-kit/downloads/AKX00037-schematics.pdf rename to content/hardware/09.kits/maker/make-your-uno-kit/downloads/AKX00037-schematics.pdf diff --git a/content/hardware/08.kits/maker/make-your-uno-kit/downloads/ASX00037-full-pinout.pdf b/content/hardware/09.kits/maker/make-your-uno-kit/downloads/ASX00037-full-pinout.pdf similarity index 100% rename from content/hardware/08.kits/maker/make-your-uno-kit/downloads/ASX00037-full-pinout.pdf rename to content/hardware/09.kits/maker/make-your-uno-kit/downloads/ASX00037-full-pinout.pdf diff --git a/content/hardware/08.kits/maker/make-your-uno-kit/features.md b/content/hardware/09.kits/maker/make-your-uno-kit/features.md similarity index 96% rename from content/hardware/08.kits/maker/make-your-uno-kit/features.md rename to content/hardware/09.kits/maker/make-your-uno-kit/features.md index 0427e04ada..2130daf8ce 100644 --- a/content/hardware/08.kits/maker/make-your-uno-kit/features.md +++ b/content/hardware/09.kits/maker/make-your-uno-kit/features.md @@ -1,35 +1,35 @@ - - -The Make Your UNO Kit includes all components for you to make your own UNO, such as the ATmega328P chip, a USB-C® module, header rows and more. This kit also features a step-by-step 3D interactive model that will guide you through the soldering steps. - - - - - - - -This kit includes instructions for you who have never soldered before! But don't worry if you're an expert. You can also cut right to the chase! - - - - - -Includes all electronic components needed to build the popular Arduino UNO board from scratch! - - - - - -This kit also includes components to build a Synthesiser Shield for producing funky tunes! - - - - - -A 3D Interactive Guide is included in this kit, that allows you to follow soldering instructions in detail. - - - - - - + + +The Make Your UNO Kit includes all components for you to make your own UNO, such as the ATmega328P chip, a USB-C® module, header rows and more. This kit also features a step-by-step 3D interactive model that will guide you through the soldering steps. + + + + + + + +This kit includes instructions for you who have never soldered before! But don't worry if you're an expert. You can also cut right to the chase! + + + + + +Includes all electronic components needed to build the popular Arduino UNO board from scratch! + + + + + +This kit also includes components to build a Synthesiser Shield for producing funky tunes! + + + + + +A 3D Interactive Guide is included in this kit, that allows you to follow soldering instructions in detail. + + + + + + diff --git a/content/hardware/08.kits/maker/make-your-uno-kit/image.svg b/content/hardware/09.kits/maker/make-your-uno-kit/image.svg similarity index 100% rename from content/hardware/08.kits/maker/make-your-uno-kit/image.svg rename to content/hardware/09.kits/maker/make-your-uno-kit/image.svg diff --git a/content/hardware/08.kits/maker/make-your-uno-kit/interactive/ASX00037-pinout.png b/content/hardware/09.kits/maker/make-your-uno-kit/interactive/ASX00037-pinout.png similarity index 100% rename from content/hardware/08.kits/maker/make-your-uno-kit/interactive/ASX00037-pinout.png rename to content/hardware/09.kits/maker/make-your-uno-kit/interactive/ASX00037-pinout.png diff --git a/content/hardware/08.kits/maker/make-your-uno-kit/interactive/altium.zip b/content/hardware/09.kits/maker/make-your-uno-kit/interactive/altium.zip similarity index 100% rename from content/hardware/08.kits/maker/make-your-uno-kit/interactive/altium.zip rename to content/hardware/09.kits/maker/make-your-uno-kit/interactive/altium.zip diff --git a/content/hardware/08.kits/maker/make-your-uno-kit/product.md b/content/hardware/09.kits/maker/make-your-uno-kit/product.md similarity index 98% rename from content/hardware/08.kits/maker/make-your-uno-kit/product.md rename to content/hardware/09.kits/maker/make-your-uno-kit/product.md index d589c83562..49451ce96f 100644 --- a/content/hardware/08.kits/maker/make-your-uno-kit/product.md +++ b/content/hardware/09.kits/maker/make-your-uno-kit/product.md @@ -1,8 +1,8 @@ ---- -title: Make Your UNO Kit -url_shop: https://store.arduino.cc/products/make-your-uno-kit -url_guide: https://makeyouruno.arduino.cc/ -certifications: [CE] ---- - +--- +title: Make Your UNO Kit +url_shop: https://store.arduino.cc/products/make-your-uno-kit +url_guide: https://makeyouruno.arduino.cc/ +certifications: [CE] +--- + Build your own Arduino UNO from scratch using raw electronic components! The Make Your UNO Kit includes all electronic components needed to build the classic UNO board, a long with 3D instructions, video & text content to support your journey. \ No newline at end of file diff --git a/content/hardware/08.kits/maker/make-your-uno-kit/tech-specs.md b/content/hardware/09.kits/maker/make-your-uno-kit/tech-specs.md similarity index 100% rename from content/hardware/08.kits/maker/make-your-uno-kit/tech-specs.md rename to content/hardware/09.kits/maker/make-your-uno-kit/tech-specs.md diff --git a/content/hardware/08.kits/maker/make-your-uno-kit/tech-specs.yml b/content/hardware/09.kits/maker/make-your-uno-kit/tech-specs.yml similarity index 94% rename from content/hardware/08.kits/maker/make-your-uno-kit/tech-specs.yml rename to content/hardware/09.kits/maker/make-your-uno-kit/tech-specs.yml index 9e331d609d..231c597ccb 100644 --- a/content/hardware/08.kits/maker/make-your-uno-kit/tech-specs.yml +++ b/content/hardware/09.kits/maker/make-your-uno-kit/tech-specs.yml @@ -1,52 +1,52 @@ -Kit: - Name: Arduino® Make Your UNO Kit - SKU: AKX00037 -PCB: - Board PCB Sheet: 1x - Shield PCB Sheet: 1x -Integrated Circuits: - ATmega328P: 1x - LM386 (amplifier): 1x - USB-C® Module: 1x -LEDs: - Green: 1x - Yellow: 4x -Resistors: - 10Ω: 1x - 1kΩ: 7x - 10kΩ: 2x - 100kΩ: 1x - 1MΩ: 2x -Capacitors: - Yellow 22pF: 3x - Yellow 47pF: 1x - Electrolytic Black 47μF: 3x - Electrolytic Black 220μF: 1x - Blue 100nF: 8x -Other Electronics: - Speaker 8Ω 1W: 1x - Crystal 16mHz, 20pF: 1x - Diode: 1x - Potentiometer 10kΩ: 6x - Potentiometer Knob: 6x - Pushbutton: 1x - LDO (3.3V): 1x - LDO (5V): 1x - Power Jack: 1x -Connectors: - UNO I/O Connector: 2x - ICPS Connector: 1x - ATmega328P Socket: 1x - 1x10 Pin Header: 1x - 1x8 Pin Header: 2x - 1x6 Pin Header: 1x -Mechanical Components: - M3 Spacer 12mm: 5x - M3 Screw 6mm: 11x - M3 Screw 12mm: 2x - M3 Bolt: 5x - - - - - +Kit: + Name: Arduino® Make Your UNO Kit + SKU: AKX00037 +PCB: + Board PCB Sheet: 1x + Shield PCB Sheet: 1x +Integrated Circuits: + ATmega328P: 1x + LM386 (amplifier): 1x + USB-C® Module: 1x +LEDs: + Green: 1x + Yellow: 4x +Resistors: + 10Ω: 1x + 1kΩ: 7x + 10kΩ: 2x + 100kΩ: 1x + 1MΩ: 2x +Capacitors: + Yellow 22pF: 3x + Yellow 47pF: 1x + Electrolytic Black 47μF: 3x + Electrolytic Black 220μF: 1x + Blue 100nF: 8x +Other Electronics: + Speaker 8Ω 1W: 1x + Crystal 16mHz, 20pF: 1x + Diode: 1x + Potentiometer 10kΩ: 6x + Potentiometer Knob: 6x + Pushbutton: 1x + LDO (3.3V): 1x + LDO (5V): 1x + Power Jack: 1x +Connectors: + UNO I/O Connector: 2x + ICPS Connector: 1x + ATmega328P Socket: 1x + 1x10 Pin Header: 1x + 1x8 Pin Header: 2x + 1x6 Pin Header: 1x +Mechanical Components: + M3 Spacer 12mm: 5x + M3 Screw 6mm: 11x + M3 Screw 12mm: 2x + M3 Bolt: 5x + + + + + diff --git a/content/hardware/08.kits/maker/iot-bundle/compatibility.yml b/content/hardware/09.kits/maker/plant-watering-kit/compatibility.yml similarity index 93% rename from content/hardware/08.kits/maker/iot-bundle/compatibility.yml rename to content/hardware/09.kits/maker/plant-watering-kit/compatibility.yml index fb978c4b11..68fc831f20 100644 --- a/content/hardware/08.kits/maker/iot-bundle/compatibility.yml +++ b/content/hardware/09.kits/maker/plant-watering-kit/compatibility.yml @@ -1,8 +1,8 @@ -software: - - arduino-ide - - arduino-cli - - web-editor -hardware: - shields: ~ - carriers: ~ +software: + - arduino-ide + - arduino-cli + - web-editor +hardware: + shields: ~ + carriers: ~ boards: ~ \ No newline at end of file diff --git a/content/hardware/08.kits/maker/plant-watering-kit/features.md b/content/hardware/09.kits/maker/plant-watering-kit/features.md similarity index 100% rename from content/hardware/08.kits/maker/plant-watering-kit/features.md rename to content/hardware/09.kits/maker/plant-watering-kit/features.md diff --git a/content/hardware/08.kits/maker/plant-watering-kit/image.svg b/content/hardware/09.kits/maker/plant-watering-kit/image.svg similarity index 100% rename from content/hardware/08.kits/maker/plant-watering-kit/image.svg rename to content/hardware/09.kits/maker/plant-watering-kit/image.svg diff --git a/content/hardware/08.kits/maker/plant-watering-kit/product.md b/content/hardware/09.kits/maker/plant-watering-kit/product.md similarity index 100% rename from content/hardware/08.kits/maker/plant-watering-kit/product.md rename to content/hardware/09.kits/maker/plant-watering-kit/product.md diff --git a/content/hardware/08.kits/maker/plant-watering-kit/tech-specs.md b/content/hardware/09.kits/maker/plant-watering-kit/tech-specs.md similarity index 100% rename from content/hardware/08.kits/maker/plant-watering-kit/tech-specs.md rename to content/hardware/09.kits/maker/plant-watering-kit/tech-specs.md diff --git a/content/hardware/08.kits/maker/plant-watering-kit/tech-specs.yml b/content/hardware/09.kits/maker/plant-watering-kit/tech-specs.yml similarity index 100% rename from content/hardware/08.kits/maker/plant-watering-kit/tech-specs.yml rename to content/hardware/09.kits/maker/plant-watering-kit/tech-specs.yml diff --git a/content/hardware/08.kits/maker/plant-watering-kit/tutorials/iot-smart-garden-setup-with-nanorp2040/assets/cabletwisting.gif b/content/hardware/09.kits/maker/plant-watering-kit/tutorials/iot-smart-garden-setup-with-nanorp2040/assets/cabletwisting.gif similarity index 100% rename from content/hardware/08.kits/maker/plant-watering-kit/tutorials/iot-smart-garden-setup-with-nanorp2040/assets/cabletwisting.gif rename to content/hardware/09.kits/maker/plant-watering-kit/tutorials/iot-smart-garden-setup-with-nanorp2040/assets/cabletwisting.gif diff --git a/content/hardware/08.kits/maker/plant-watering-kit/tutorials/iot-smart-garden-setup-with-nanorp2040/assets/completesetup.jpg b/content/hardware/09.kits/maker/plant-watering-kit/tutorials/iot-smart-garden-setup-with-nanorp2040/assets/completesetup.jpg similarity index 100% rename from content/hardware/08.kits/maker/plant-watering-kit/tutorials/iot-smart-garden-setup-with-nanorp2040/assets/completesetup.jpg rename to content/hardware/09.kits/maker/plant-watering-kit/tutorials/iot-smart-garden-setup-with-nanorp2040/assets/completesetup.jpg diff --git a/content/hardware/08.kits/maker/plant-watering-kit/tutorials/iot-smart-garden-setup-with-nanorp2040/assets/coverpage.png b/content/hardware/09.kits/maker/plant-watering-kit/tutorials/iot-smart-garden-setup-with-nanorp2040/assets/coverpage.png similarity index 100% rename from content/hardware/08.kits/maker/plant-watering-kit/tutorials/iot-smart-garden-setup-with-nanorp2040/assets/coverpage.png rename to content/hardware/09.kits/maker/plant-watering-kit/tutorials/iot-smart-garden-setup-with-nanorp2040/assets/coverpage.png diff --git a/content/hardware/08.kits/maker/plant-watering-kit/tutorials/iot-smart-garden-setup-with-nanorp2040/assets/dashboard-overview.png b/content/hardware/09.kits/maker/plant-watering-kit/tutorials/iot-smart-garden-setup-with-nanorp2040/assets/dashboard-overview.png similarity index 100% rename from content/hardware/08.kits/maker/plant-watering-kit/tutorials/iot-smart-garden-setup-with-nanorp2040/assets/dashboard-overview.png rename to content/hardware/09.kits/maker/plant-watering-kit/tutorials/iot-smart-garden-setup-with-nanorp2040/assets/dashboard-overview.png diff --git a/content/hardware/08.kits/maker/plant-watering-kit/tutorials/iot-smart-garden-setup-with-nanorp2040/assets/dashboard_initial.png b/content/hardware/09.kits/maker/plant-watering-kit/tutorials/iot-smart-garden-setup-with-nanorp2040/assets/dashboard_initial.png similarity index 100% rename from content/hardware/08.kits/maker/plant-watering-kit/tutorials/iot-smart-garden-setup-with-nanorp2040/assets/dashboard_initial.png rename to content/hardware/09.kits/maker/plant-watering-kit/tutorials/iot-smart-garden-setup-with-nanorp2040/assets/dashboard_initial.png diff --git a/content/hardware/08.kits/maker/plant-watering-kit/tutorials/iot-smart-garden-setup-with-nanorp2040/assets/step1.png b/content/hardware/09.kits/maker/plant-watering-kit/tutorials/iot-smart-garden-setup-with-nanorp2040/assets/step1.png similarity index 100% rename from content/hardware/08.kits/maker/plant-watering-kit/tutorials/iot-smart-garden-setup-with-nanorp2040/assets/step1.png rename to content/hardware/09.kits/maker/plant-watering-kit/tutorials/iot-smart-garden-setup-with-nanorp2040/assets/step1.png diff --git a/content/hardware/08.kits/maker/plant-watering-kit/tutorials/iot-smart-garden-setup-with-nanorp2040/assets/step2.png b/content/hardware/09.kits/maker/plant-watering-kit/tutorials/iot-smart-garden-setup-with-nanorp2040/assets/step2.png similarity index 100% rename from content/hardware/08.kits/maker/plant-watering-kit/tutorials/iot-smart-garden-setup-with-nanorp2040/assets/step2.png rename to content/hardware/09.kits/maker/plant-watering-kit/tutorials/iot-smart-garden-setup-with-nanorp2040/assets/step2.png diff --git a/content/hardware/08.kits/maker/plant-watering-kit/tutorials/iot-smart-garden-setup-with-nanorp2040/assets/step3.png b/content/hardware/09.kits/maker/plant-watering-kit/tutorials/iot-smart-garden-setup-with-nanorp2040/assets/step3.png similarity index 100% rename from content/hardware/08.kits/maker/plant-watering-kit/tutorials/iot-smart-garden-setup-with-nanorp2040/assets/step3.png rename to content/hardware/09.kits/maker/plant-watering-kit/tutorials/iot-smart-garden-setup-with-nanorp2040/assets/step3.png diff --git a/content/hardware/08.kits/maker/plant-watering-kit/tutorials/iot-smart-garden-setup-with-nanorp2040/assets/step4.png b/content/hardware/09.kits/maker/plant-watering-kit/tutorials/iot-smart-garden-setup-with-nanorp2040/assets/step4.png similarity index 100% rename from content/hardware/08.kits/maker/plant-watering-kit/tutorials/iot-smart-garden-setup-with-nanorp2040/assets/step4.png rename to content/hardware/09.kits/maker/plant-watering-kit/tutorials/iot-smart-garden-setup-with-nanorp2040/assets/step4.png diff --git a/content/hardware/08.kits/maker/plant-watering-kit/tutorials/iot-smart-garden-setup-with-nanorp2040/assets/step5.png b/content/hardware/09.kits/maker/plant-watering-kit/tutorials/iot-smart-garden-setup-with-nanorp2040/assets/step5.png similarity index 100% rename from content/hardware/08.kits/maker/plant-watering-kit/tutorials/iot-smart-garden-setup-with-nanorp2040/assets/step5.png rename to content/hardware/09.kits/maker/plant-watering-kit/tutorials/iot-smart-garden-setup-with-nanorp2040/assets/step5.png diff --git a/content/hardware/08.kits/maker/plant-watering-kit/tutorials/iot-smart-garden-setup-with-nanorp2040/assets/step6.png b/content/hardware/09.kits/maker/plant-watering-kit/tutorials/iot-smart-garden-setup-with-nanorp2040/assets/step6.png similarity index 100% rename from content/hardware/08.kits/maker/plant-watering-kit/tutorials/iot-smart-garden-setup-with-nanorp2040/assets/step6.png rename to content/hardware/09.kits/maker/plant-watering-kit/tutorials/iot-smart-garden-setup-with-nanorp2040/assets/step6.png diff --git a/content/hardware/08.kits/maker/plant-watering-kit/tutorials/iot-smart-garden-setup-with-nanorp2040/assets/step7.png b/content/hardware/09.kits/maker/plant-watering-kit/tutorials/iot-smart-garden-setup-with-nanorp2040/assets/step7.png similarity index 100% rename from content/hardware/08.kits/maker/plant-watering-kit/tutorials/iot-smart-garden-setup-with-nanorp2040/assets/step7.png rename to content/hardware/09.kits/maker/plant-watering-kit/tutorials/iot-smart-garden-setup-with-nanorp2040/assets/step7.png diff --git a/content/hardware/08.kits/maker/plant-watering-kit/tutorials/iot-smart-garden-setup-with-nanorp2040/assets/template_overview.png b/content/hardware/09.kits/maker/plant-watering-kit/tutorials/iot-smart-garden-setup-with-nanorp2040/assets/template_overview.png similarity index 100% rename from content/hardware/08.kits/maker/plant-watering-kit/tutorials/iot-smart-garden-setup-with-nanorp2040/assets/template_overview.png rename to content/hardware/09.kits/maker/plant-watering-kit/tutorials/iot-smart-garden-setup-with-nanorp2040/assets/template_overview.png diff --git a/content/hardware/08.kits/maker/plant-watering-kit/tutorials/iot-smart-garden-setup-with-nanorp2040/assets/things.png b/content/hardware/09.kits/maker/plant-watering-kit/tutorials/iot-smart-garden-setup-with-nanorp2040/assets/things.png similarity index 100% rename from content/hardware/08.kits/maker/plant-watering-kit/tutorials/iot-smart-garden-setup-with-nanorp2040/assets/things.png rename to content/hardware/09.kits/maker/plant-watering-kit/tutorials/iot-smart-garden-setup-with-nanorp2040/assets/things.png diff --git a/content/hardware/08.kits/maker/plant-watering-kit/tutorials/iot-smart-garden-setup-with-nanorp2040/assets/ziptie.gif b/content/hardware/09.kits/maker/plant-watering-kit/tutorials/iot-smart-garden-setup-with-nanorp2040/assets/ziptie.gif similarity index 100% rename from content/hardware/08.kits/maker/plant-watering-kit/tutorials/iot-smart-garden-setup-with-nanorp2040/assets/ziptie.gif rename to content/hardware/09.kits/maker/plant-watering-kit/tutorials/iot-smart-garden-setup-with-nanorp2040/assets/ziptie.gif diff --git a/content/hardware/08.kits/maker/plant-watering-kit/tutorials/iot-smart-garden-setup-with-nanorp2040/content.md b/content/hardware/09.kits/maker/plant-watering-kit/tutorials/iot-smart-garden-setup-with-nanorp2040/content.md similarity index 100% rename from content/hardware/08.kits/maker/plant-watering-kit/tutorials/iot-smart-garden-setup-with-nanorp2040/content.md rename to content/hardware/09.kits/maker/plant-watering-kit/tutorials/iot-smart-garden-setup-with-nanorp2040/content.md diff --git a/content/hardware/08.kits/maker/plant-watering-kit/tutorials/iot-smart-garden-setup-with-nanorp2040/hero-banner.png b/content/hardware/09.kits/maker/plant-watering-kit/tutorials/iot-smart-garden-setup-with-nanorp2040/hero-banner.png similarity index 100% rename from content/hardware/08.kits/maker/plant-watering-kit/tutorials/iot-smart-garden-setup-with-nanorp2040/hero-banner.png rename to content/hardware/09.kits/maker/plant-watering-kit/tutorials/iot-smart-garden-setup-with-nanorp2040/hero-banner.png diff --git a/content/hardware/09.mega/boards/category.md b/content/hardware/10.mega/boards/category.md similarity index 100% rename from content/hardware/09.mega/boards/category.md rename to content/hardware/10.mega/boards/category.md diff --git a/content/hardware/09.mega/boards/due/certifications/Arduino_A000056-DoC_CE_without headers.pdf b/content/hardware/10.mega/boards/due/certifications/Arduino_A000056-DoC_CE_without headers.pdf similarity index 100% rename from content/hardware/09.mega/boards/due/certifications/Arduino_A000056-DoC_CE_without headers.pdf rename to content/hardware/10.mega/boards/due/certifications/Arduino_A000056-DoC_CE_without headers.pdf diff --git a/content/hardware/09.mega/boards/due/certifications/Arduino_A000062-DoC_CE.pdf b/content/hardware/10.mega/boards/due/certifications/Arduino_A000062-DoC_CE.pdf similarity index 100% rename from content/hardware/09.mega/boards/due/certifications/Arduino_A000062-DoC_CE.pdf rename to content/hardware/10.mega/boards/due/certifications/Arduino_A000062-DoC_CE.pdf diff --git a/content/hardware/09.mega/boards/due/certifications/Arduino_A000062-DoC_UKCA.pdf b/content/hardware/10.mega/boards/due/certifications/Arduino_A000062-DoC_UKCA.pdf similarity index 100% rename from content/hardware/09.mega/boards/due/certifications/Arduino_A000062-DoC_UKCA.pdf rename to content/hardware/10.mega/boards/due/certifications/Arduino_A000062-DoC_UKCA.pdf diff --git a/content/hardware/09.mega/boards/due/compatibility.yml b/content/hardware/10.mega/boards/due/compatibility.yml similarity index 100% rename from content/hardware/09.mega/boards/due/compatibility.yml rename to content/hardware/10.mega/boards/due/compatibility.yml diff --git a/content/hardware/09.mega/boards/due/downloads/A000056-full-pinout.pdf b/content/hardware/10.mega/boards/due/downloads/A000056-full-pinout.pdf similarity index 100% rename from content/hardware/09.mega/boards/due/downloads/A000056-full-pinout.pdf rename to content/hardware/10.mega/boards/due/downloads/A000056-full-pinout.pdf diff --git a/content/hardware/09.mega/boards/due/downloads/eagle-files.zip b/content/hardware/10.mega/boards/due/downloads/eagle-files.zip similarity index 100% rename from content/hardware/09.mega/boards/due/downloads/eagle-files.zip rename to content/hardware/10.mega/boards/due/downloads/eagle-files.zip diff --git a/content/hardware/09.mega/boards/due/downloads/fritzing.fzpz b/content/hardware/10.mega/boards/due/downloads/fritzing.fzpz similarity index 100% rename from content/hardware/09.mega/boards/due/downloads/fritzing.fzpz rename to content/hardware/10.mega/boards/due/downloads/fritzing.fzpz diff --git a/content/hardware/09.mega/boards/due/downloads/schematics.pdf b/content/hardware/10.mega/boards/due/downloads/schematics.pdf similarity index 100% rename from content/hardware/09.mega/boards/due/downloads/schematics.pdf rename to content/hardware/10.mega/boards/due/downloads/schematics.pdf diff --git a/content/hardware/09.mega/boards/due/essentials.md b/content/hardware/10.mega/boards/due/essentials.md similarity index 100% rename from content/hardware/09.mega/boards/due/essentials.md rename to content/hardware/10.mega/boards/due/essentials.md diff --git a/content/hardware/09.mega/boards/due/features.md b/content/hardware/10.mega/boards/due/features.md similarity index 100% rename from content/hardware/09.mega/boards/due/features.md rename to content/hardware/10.mega/boards/due/features.md diff --git a/content/hardware/09.mega/boards/due/image.svg b/content/hardware/10.mega/boards/due/image.svg similarity index 100% rename from content/hardware/09.mega/boards/due/image.svg rename to content/hardware/10.mega/boards/due/image.svg diff --git a/content/hardware/09.mega/boards/due/interactive/A000056-pinout.png b/content/hardware/10.mega/boards/due/interactive/A000056-pinout.png similarity index 100% rename from content/hardware/09.mega/boards/due/interactive/A000056-pinout.png rename to content/hardware/10.mega/boards/due/interactive/A000056-pinout.png diff --git a/content/hardware/09.mega/boards/due/interactive/A000062-altium.zip.gpg b/content/hardware/10.mega/boards/due/interactive/A000062-altium.zip.gpg similarity index 100% rename from content/hardware/09.mega/boards/due/interactive/A000062-altium.zip.gpg rename to content/hardware/10.mega/boards/due/interactive/A000062-altium.zip.gpg diff --git a/content/hardware/09.mega/boards/due/product.md b/content/hardware/10.mega/boards/due/product.md similarity index 100% rename from content/hardware/09.mega/boards/due/product.md rename to content/hardware/10.mega/boards/due/product.md diff --git a/content/hardware/09.mega/boards/due/suggestions.md b/content/hardware/10.mega/boards/due/suggestions.md similarity index 100% rename from content/hardware/09.mega/boards/due/suggestions.md rename to content/hardware/10.mega/boards/due/suggestions.md diff --git a/content/hardware/09.mega/boards/due/tech-specs.md b/content/hardware/10.mega/boards/due/tech-specs.md similarity index 100% rename from content/hardware/09.mega/boards/due/tech-specs.md rename to content/hardware/10.mega/boards/due/tech-specs.md diff --git a/content/hardware/09.mega/boards/due/tech-specs.yml b/content/hardware/10.mega/boards/due/tech-specs.yml similarity index 100% rename from content/hardware/09.mega/boards/due/tech-specs.yml rename to content/hardware/10.mega/boards/due/tech-specs.yml diff --git a/content/hardware/09.mega/boards/due/tutorials/due-extended-spi/due-extended-spi.md b/content/hardware/10.mega/boards/due/tutorials/due-extended-spi/due-extended-spi.md similarity index 100% rename from content/hardware/09.mega/boards/due/tutorials/due-extended-spi/due-extended-spi.md rename to content/hardware/10.mega/boards/due/tutorials/due-extended-spi/due-extended-spi.md diff --git a/content/hardware/09.mega/boards/due/tutorials/due-motor-shield-dc/assets/DueMotorShieldFan.jpg b/content/hardware/10.mega/boards/due/tutorials/due-motor-shield-dc/assets/DueMotorShieldFan.jpg similarity index 100% rename from content/hardware/09.mega/boards/due/tutorials/due-motor-shield-dc/assets/DueMotorShieldFan.jpg rename to content/hardware/10.mega/boards/due/tutorials/due-motor-shield-dc/assets/DueMotorShieldFan.jpg diff --git a/content/hardware/09.mega/boards/due/tutorials/due-motor-shield-dc/due-motor-shield-dc.md b/content/hardware/10.mega/boards/due/tutorials/due-motor-shield-dc/due-motor-shield-dc.md similarity index 100% rename from content/hardware/09.mega/boards/due/tutorials/due-motor-shield-dc/due-motor-shield-dc.md rename to content/hardware/10.mega/boards/due/tutorials/due-motor-shield-dc/due-motor-shield-dc.md diff --git a/content/hardware/09.mega/boards/due/tutorials/keyboard-controller/keyboard-controller.md b/content/hardware/10.mega/boards/due/tutorials/keyboard-controller/keyboard-controller.md similarity index 100% rename from content/hardware/09.mega/boards/due/tutorials/keyboard-controller/keyboard-controller.md rename to content/hardware/10.mega/boards/due/tutorials/keyboard-controller/keyboard-controller.md diff --git a/content/hardware/09.mega/boards/due/tutorials/mouse-controller/assets/DueUSBPorts.png b/content/hardware/10.mega/boards/due/tutorials/mouse-controller/assets/DueUSBPorts.png similarity index 100% rename from content/hardware/09.mega/boards/due/tutorials/mouse-controller/assets/DueUSBPorts.png rename to content/hardware/10.mega/boards/due/tutorials/mouse-controller/assets/DueUSBPorts.png diff --git a/content/hardware/09.mega/boards/due/tutorials/mouse-controller/mouse-controller.md b/content/hardware/10.mega/boards/due/tutorials/mouse-controller/mouse-controller.md similarity index 100% rename from content/hardware/09.mega/boards/due/tutorials/mouse-controller/mouse-controller.md rename to content/hardware/10.mega/boards/due/tutorials/mouse-controller/mouse-controller.md diff --git a/content/hardware/09.mega/boards/due/tutorials/multiple-blinks/content.md b/content/hardware/10.mega/boards/due/tutorials/multiple-blinks/content.md similarity index 100% rename from content/hardware/09.mega/boards/due/tutorials/multiple-blinks/content.md rename to content/hardware/10.mega/boards/due/tutorials/multiple-blinks/content.md diff --git a/content/hardware/09.mega/boards/due/tutorials/simple-waveform-generator/assets/DueSimpleWaveform_fritzing.png b/content/hardware/10.mega/boards/due/tutorials/simple-waveform-generator/assets/DueSimpleWaveform_fritzing.png similarity index 100% rename from content/hardware/09.mega/boards/due/tutorials/simple-waveform-generator/assets/DueSimpleWaveform_fritzing.png rename to content/hardware/10.mega/boards/due/tutorials/simple-waveform-generator/assets/DueSimpleWaveform_fritzing.png diff --git a/content/hardware/09.mega/boards/due/tutorials/simple-waveform-generator/assets/Duewaveforms.jpg b/content/hardware/10.mega/boards/due/tutorials/simple-waveform-generator/assets/Duewaveforms.jpg similarity index 100% rename from content/hardware/09.mega/boards/due/tutorials/simple-waveform-generator/assets/Duewaveforms.jpg rename to content/hardware/10.mega/boards/due/tutorials/simple-waveform-generator/assets/Duewaveforms.jpg diff --git a/content/hardware/09.mega/boards/due/tutorials/simple-waveform-generator/keyboard-controller/assets/DueUSBPorts.png b/content/hardware/10.mega/boards/due/tutorials/simple-waveform-generator/keyboard-controller/assets/DueUSBPorts.png similarity index 100% rename from content/hardware/09.mega/boards/due/tutorials/simple-waveform-generator/keyboard-controller/assets/DueUSBPorts.png rename to content/hardware/10.mega/boards/due/tutorials/simple-waveform-generator/keyboard-controller/assets/DueUSBPorts.png diff --git a/content/hardware/09.mega/boards/due/tutorials/simple-waveform-generator/keyboard-controller/keyboard-controller.md b/content/hardware/10.mega/boards/due/tutorials/simple-waveform-generator/keyboard-controller/keyboard-controller.md similarity index 100% rename from content/hardware/09.mega/boards/due/tutorials/simple-waveform-generator/keyboard-controller/keyboard-controller.md rename to content/hardware/10.mega/boards/due/tutorials/simple-waveform-generator/keyboard-controller/keyboard-controller.md diff --git a/content/hardware/09.mega/boards/due/tutorials/simple-waveform-generator/simple-waveform-generator.md b/content/hardware/10.mega/boards/due/tutorials/simple-waveform-generator/simple-waveform-generator.md similarity index 97% rename from content/hardware/09.mega/boards/due/tutorials/simple-waveform-generator/simple-waveform-generator.md rename to content/hardware/10.mega/boards/due/tutorials/simple-waveform-generator/simple-waveform-generator.md index 7ebc12fb00..b495daff60 100644 --- a/content/hardware/09.mega/boards/due/tutorials/simple-waveform-generator/simple-waveform-generator.md +++ b/content/hardware/10.mega/boards/due/tutorials/simple-waveform-generator/simple-waveform-generator.md @@ -1,249 +1,249 @@ ---- -compatible-products: [due] -title: 'Simple Waveform Generator with Arduino Due' -difficulty: intermediate -description: 'Generate waveforms by using the Arduino Due and its DAC features' -tags: - - Waveforms - - Frequency -libraries: - - name: Waveforms - url: https://github.com/hoilett/Waveforms/blob/master/Waveforms.h -hardware: - - hardware/02.hero/boards/due -software: - - ide-v1 - - ide-v2 - - web-editor -author: "Arduino" ---- - -## Introduction - -This tutorial shows how to make a simple waveform generator by using the DAC features of the Arduino Due board. - -With push buttons, you will be able to choose a waveform shape (sine, triangular, sawtooth, or square) that we will send to to send to the DAC0 and DAC1 channels and change the frequency of the generated signal with a potentiometer. - -## Goals - -- Create a simple waveform generator. -- Learn about DAC features on the DUE board. - -## Hardware & Software Needed - -- [Arduino Due](https://store.arduino.cc/arduino-due) -- 10K Ω potentiometer -- 2x push buttons -- 2x 10K Ω resistors -- Jumper wires -- Breadboard -- Arduino IDE ([online](https://create.arduino.cc/) or [offline](https://www.arduino.cc/en/main/software)). -- [Waveforms library](https://github.com/hoilett/Waveforms/blob/master/Waveforms.h) -- Oscilloscope (optional) - -## Circuit - -Connect power and ground on your breadboard to the Arduino. In the image below, the red (power) and black (ground) wires connect to the two long vertical rows on the breadboard, providing access to 3.3V and ground. - -Connect a wire from digital pin 2 to one leg of a pushbutton. That same leg of the button connects through a pull-down resistor (10-kilohm) to ground. The other leg of the button connects to the 3.3V power. - -Wire up another button in the same fashion, but to digital pin 3. - -Hook up the potentiometer by connecting one side to power and the other side to ground. The pin in the middle of the potentiometer goes to analog input 0. - -Pins DAC0 and DAC1 will generate the waveform. You can use an oscilloscope to visualize the generated waveforms. - -![The circuit for this tutorial.](assets/DueSimpleWaveform_fritzing.png) - -## Programming the Board - -The waveforms are stored inside a two-dimensional array where each row represent a different waveform shape. The waveform samples are contained inside the columns, so you can access the waveform table using two indexes: - -```arduino -waveformsTable[waveformIndex][samplesIndex] -``` - -With the waveformIndex array, you choose which samples to read. By incrementing the sampleIndex array from 0 to the maximum in a fixed time, you will create the waveform shape. Repeating this procedure continuously and sending the samples values on the DAC output will give you a constant signal. - -In order to choose the waveform shape with a push button, match the button press to the waveformIndex increment. You can use the interrupts, triggering the the press event using the RISING option for easy access. So, when the Arduino Due sees a rising edge on the button pin, it will execute the function linked to the interrupt matched with the button: - -`void waveCh0_select()` and `void waveCh1_select()` - -The potentiometer connected to analog pin 0 is used to choose the sample rate and the period of the signal is given by the sample rate multiplied for the number of the samples. - -Taking into account the time for the instructions to execute, and adding the time for the analog input (around 40 µS to read the pot), maximum frequency for the signal with this sketch is around 170 Hz. - -The sketch is composed of two files. One has the two-dimensional arrays, with the table of the samples for all the waveforms for legibility. Download the attached file from [GitHub](https://github.com/hoilett/Waveforms/blob/master/Waveforms.h), or if you want to start from scratch you have to create a new folder inside your sketchbook folder and place the two files inside. The sketch file must have the same name of the folder, and the file with the sample table must be named `"Waveforms.h"`. - - -### Code - -**FunctionGenerator.ino** - -```arduino -/* - Simple Waveform generator with Arduino Due - - * connect two push buttons to the digital pins 2 and 3 - with a 10 kilohm pulldown resistor to choose the waveform - to send to the DAC0 and DAC1 channels - * connect a 10 kilohm potentiometer to A0 to control the - signal frequency - - */ - -#include "Waveforms.h" - -#define oneHzSample 1000000/maxSamplesNum // sample for the 1Hz signal expressed in microseconds - -const int button0 = 2, button1 = 3; -volatile int wave0 = 0, wave1 = 0; - -int i = 0; -int sample; - - -void setup() { - analogWriteResolution(12); // set the analog output resolution to 12 bit (4096 levels) - analogReadResolution(12); // set the analog input resolution to 12 bit - - attachInterrupt(button0, wave0Select, RISING); // Interrupt attached to the button connected to pin 2 - attachInterrupt(button1, wave1Select, RISING); // Interrupt attached to the button connected to pin 3 -} - -void loop() { - // Read the the potentiometer and map the value between the maximum and the minimum sample available - // 1 Hz is the minimum freq for the complete wave - // 170 Hz is the maximum freq for the complete wave. Measured considering the loop and the analogRead() time - sample = map(analogRead(A0), 0, 4095, 0, oneHzSample); - sample = constrain(t_sample, 0, oneHzSample); - - analogWrite(DAC0, waveformsTable[wave0][i]); // write the selected waveform on DAC0 - analogWrite(DAC1, waveformsTable[wave1][i]); // write the selected waveform on DAC1 - - i++; - if(i == maxSamplesNum) // Reset the counter to repeat the wave - i = 0; - - delayMicroseconds(sample); // Hold the sample value for the sample time -} - -// function hooked to the interrupt on digital pin 2 -void wave0Select() { - wave0++; - if(wave0 == 4) - wave0 = 0; -} - -// function hooked to the interrupt on digital pin 3 -void wave1Select() { - wave1++; - if(wave1 == 4) - wave1 = 0; -} -``` - -**Waveforms.h** - -```arduino - -#ifndef _Waveforms_h_ -#define _Waveforms_h_ - -#define maxWaveform 4 -#define maxSamplesNum 120 - -static int waveformsTable[maxWaveform][maxSamplesNum] = { - // Sin wave - { - 0x7ff, 0x86a, 0x8d5, 0x93f, 0x9a9, 0xa11, 0xa78, 0xadd, 0xb40, 0xba1, - 0xbff, 0xc5a, 0xcb2, 0xd08, 0xd59, 0xda7, 0xdf1, 0xe36, 0xe77, 0xeb4, - 0xeec, 0xf1f, 0xf4d, 0xf77, 0xf9a, 0xfb9, 0xfd2, 0xfe5, 0xff3, 0xffc, - 0xfff, 0xffc, 0xff3, 0xfe5, 0xfd2, 0xfb9, 0xf9a, 0xf77, 0xf4d, 0xf1f, - 0xeec, 0xeb4, 0xe77, 0xe36, 0xdf1, 0xda7, 0xd59, 0xd08, 0xcb2, 0xc5a, - 0xbff, 0xba1, 0xb40, 0xadd, 0xa78, 0xa11, 0x9a9, 0x93f, 0x8d5, 0x86a, - 0x7ff, 0x794, 0x729, 0x6bf, 0x655, 0x5ed, 0x586, 0x521, 0x4be, 0x45d, - 0x3ff, 0x3a4, 0x34c, 0x2f6, 0x2a5, 0x257, 0x20d, 0x1c8, 0x187, 0x14a, - 0x112, 0xdf, 0xb1, 0x87, 0x64, 0x45, 0x2c, 0x19, 0xb, 0x2, - 0x0, 0x2, 0xb, 0x19, 0x2c, 0x45, 0x64, 0x87, 0xb1, 0xdf, - 0x112, 0x14a, 0x187, 0x1c8, 0x20d, 0x257, 0x2a5, 0x2f6, 0x34c, 0x3a4, - 0x3ff, 0x45d, 0x4be, 0x521, 0x586, 0x5ed, 0x655, 0x6bf, 0x729, 0x794 - } - , - - // Triangular wave - { - 0x44, 0x88, 0xcc, 0x110, 0x154, 0x198, 0x1dc, 0x220, 0x264, 0x2a8, - 0x2ec, 0x330, 0x374, 0x3b8, 0x3fc, 0x440, 0x484, 0x4c8, 0x50c, 0x550, - 0x594, 0x5d8, 0x61c, 0x660, 0x6a4, 0x6e8, 0x72c, 0x770, 0x7b4, 0x7f8, - 0x83c, 0x880, 0x8c4, 0x908, 0x94c, 0x990, 0x9d4, 0xa18, 0xa5c, 0xaa0, - 0xae4, 0xb28, 0xb6c, 0xbb0, 0xbf4, 0xc38, 0xc7c, 0xcc0, 0xd04, 0xd48, - 0xd8c, 0xdd0, 0xe14, 0xe58, 0xe9c, 0xee0, 0xf24, 0xf68, 0xfac, 0xff0, - 0xfac, 0xf68, 0xf24, 0xee0, 0xe9c, 0xe58, 0xe14, 0xdd0, 0xd8c, 0xd48, - 0xd04, 0xcc0, 0xc7c, 0xc38, 0xbf4, 0xbb0, 0xb6c, 0xb28, 0xae4, 0xaa0, - 0xa5c, 0xa18, 0x9d4, 0x990, 0x94c, 0x908, 0x8c4, 0x880, 0x83c, 0x7f8, - 0x7b4, 0x770, 0x72c, 0x6e8, 0x6a4, 0x660, 0x61c, 0x5d8, 0x594, 0x550, - 0x50c, 0x4c8, 0x484, 0x440, 0x3fc, 0x3b8, 0x374, 0x330, 0x2ec, 0x2a8, - 0x264, 0x220, 0x1dc, 0x198, 0x154, 0x110, 0xcc, 0x88, 0x44, 0x0 - } - , - - // Sawtooth wave - { - 0x22, 0x44, 0x66, 0x88, 0xaa, 0xcc, 0xee, 0x110, 0x132, 0x154, - 0x176, 0x198, 0x1ba, 0x1dc, 0x1fe, 0x220, 0x242, 0x264, 0x286, 0x2a8, - 0x2ca, 0x2ec, 0x30e, 0x330, 0x352, 0x374, 0x396, 0x3b8, 0x3da, 0x3fc, - 0x41e, 0x440, 0x462, 0x484, 0x4a6, 0x4c8, 0x4ea, 0x50c, 0x52e, 0x550, - 0x572, 0x594, 0x5b6, 0x5d8, 0x5fa, 0x61c, 0x63e, 0x660, 0x682, 0x6a4, - 0x6c6, 0x6e8, 0x70a, 0x72c, 0x74e, 0x770, 0x792, 0x7b4, 0x7d6, 0x7f8, - 0x81a, 0x83c, 0x85e, 0x880, 0x8a2, 0x8c4, 0x8e6, 0x908, 0x92a, 0x94c, - 0x96e, 0x990, 0x9b2, 0x9d4, 0x9f6, 0xa18, 0xa3a, 0xa5c, 0xa7e, 0xaa0, - 0xac2, 0xae4, 0xb06, 0xb28, 0xb4a, 0xb6c, 0xb8e, 0xbb0, 0xbd2, 0xbf4, - 0xc16, 0xc38, 0xc5a, 0xc7c, 0xc9e, 0xcc0, 0xce2, 0xd04, 0xd26, 0xd48, - 0xd6a, 0xd8c, 0xdae, 0xdd0, 0xdf2, 0xe14, 0xe36, 0xe58, 0xe7a, 0xe9c, - 0xebe, 0xee0, 0xf02, 0xf24, 0xf46, 0xf68, 0xf8a, 0xfac, 0xfce, 0xff0 - } - , - - // Square wave - { - 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, - 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, - 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, - 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, - 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, - 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0 - } - -}; - -#endif -``` - - -## Testing It Out - -After you have uploaded the code, use the pushbuttons that you have hooked up to the breadboard to generate waveforms. If you have an oscilloscope, you can use it to visualize the different waveforms that you generate. You can control the signal frequency by using the potentiometer connected to `A0`. - -![Waveforms shown on an oscilloscope](assets/Duewaveforms.jpg) - - -### Troubleshoot - -If the code is not working, there are some common issues we can troubleshoot: - -- The wiring is incorrect. -- You have not installed or included all of the libraries. -- Make sure there are no missing curly brackets {}. -- We have not selected the right port and board. - - -## Conclusion - +--- +compatible-products: [due] +title: 'Simple Waveform Generator with Arduino Due' +difficulty: intermediate +description: 'Generate waveforms by using the Arduino Due and its DAC features' +tags: + - Waveforms + - Frequency +libraries: + - name: Waveforms + url: https://github.com/hoilett/Waveforms/blob/master/Waveforms.h +hardware: + - hardware/02.hero/boards/due +software: + - ide-v1 + - ide-v2 + - web-editor +author: "Arduino" +--- + +## Introduction + +This tutorial shows how to make a simple waveform generator by using the DAC features of the Arduino Due board. + +With push buttons, you will be able to choose a waveform shape (sine, triangular, sawtooth, or square) that we will send to to send to the DAC0 and DAC1 channels and change the frequency of the generated signal with a potentiometer. + +## Goals + +- Create a simple waveform generator. +- Learn about DAC features on the DUE board. + +## Hardware & Software Needed + +- [Arduino Due](https://store.arduino.cc/arduino-due) +- 10K Ω potentiometer +- 2x push buttons +- 2x 10K Ω resistors +- Jumper wires +- Breadboard +- Arduino IDE ([online](https://create.arduino.cc/) or [offline](https://www.arduino.cc/en/main/software)). +- [Waveforms library](https://github.com/hoilett/Waveforms/blob/master/Waveforms.h) +- Oscilloscope (optional) + +## Circuit + +Connect power and ground on your breadboard to the Arduino. In the image below, the red (power) and black (ground) wires connect to the two long vertical rows on the breadboard, providing access to 3.3V and ground. + +Connect a wire from digital pin 2 to one leg of a pushbutton. That same leg of the button connects through a pull-down resistor (10-kilohm) to ground. The other leg of the button connects to the 3.3V power. + +Wire up another button in the same fashion, but to digital pin 3. + +Hook up the potentiometer by connecting one side to power and the other side to ground. The pin in the middle of the potentiometer goes to analog input 0. + +Pins DAC0 and DAC1 will generate the waveform. You can use an oscilloscope to visualize the generated waveforms. + +![The circuit for this tutorial.](assets/DueSimpleWaveform_fritzing.png) + +## Programming the Board + +The waveforms are stored inside a two-dimensional array where each row represent a different waveform shape. The waveform samples are contained inside the columns, so you can access the waveform table using two indexes: + +```arduino +waveformsTable[waveformIndex][samplesIndex] +``` + +With the waveformIndex array, you choose which samples to read. By incrementing the sampleIndex array from 0 to the maximum in a fixed time, you will create the waveform shape. Repeating this procedure continuously and sending the samples values on the DAC output will give you a constant signal. + +In order to choose the waveform shape with a push button, match the button press to the waveformIndex increment. You can use the interrupts, triggering the the press event using the RISING option for easy access. So, when the Arduino Due sees a rising edge on the button pin, it will execute the function linked to the interrupt matched with the button: + +`void waveCh0_select()` and `void waveCh1_select()` + +The potentiometer connected to analog pin 0 is used to choose the sample rate and the period of the signal is given by the sample rate multiplied for the number of the samples. + +Taking into account the time for the instructions to execute, and adding the time for the analog input (around 40 µS to read the pot), maximum frequency for the signal with this sketch is around 170 Hz. + +The sketch is composed of two files. One has the two-dimensional arrays, with the table of the samples for all the waveforms for legibility. Download the attached file from [GitHub](https://github.com/hoilett/Waveforms/blob/master/Waveforms.h), or if you want to start from scratch you have to create a new folder inside your sketchbook folder and place the two files inside. The sketch file must have the same name of the folder, and the file with the sample table must be named `"Waveforms.h"`. + + +### Code + +**FunctionGenerator.ino** + +```arduino +/* + Simple Waveform generator with Arduino Due + + * connect two push buttons to the digital pins 2 and 3 + with a 10 kilohm pulldown resistor to choose the waveform + to send to the DAC0 and DAC1 channels + * connect a 10 kilohm potentiometer to A0 to control the + signal frequency + + */ + +#include "Waveforms.h" + +#define oneHzSample 1000000/maxSamplesNum // sample for the 1Hz signal expressed in microseconds + +const int button0 = 2, button1 = 3; +volatile int wave0 = 0, wave1 = 0; + +int i = 0; +int sample; + + +void setup() { + analogWriteResolution(12); // set the analog output resolution to 12 bit (4096 levels) + analogReadResolution(12); // set the analog input resolution to 12 bit + + attachInterrupt(button0, wave0Select, RISING); // Interrupt attached to the button connected to pin 2 + attachInterrupt(button1, wave1Select, RISING); // Interrupt attached to the button connected to pin 3 +} + +void loop() { + // Read the the potentiometer and map the value between the maximum and the minimum sample available + // 1 Hz is the minimum freq for the complete wave + // 170 Hz is the maximum freq for the complete wave. Measured considering the loop and the analogRead() time + sample = map(analogRead(A0), 0, 4095, 0, oneHzSample); + sample = constrain(t_sample, 0, oneHzSample); + + analogWrite(DAC0, waveformsTable[wave0][i]); // write the selected waveform on DAC0 + analogWrite(DAC1, waveformsTable[wave1][i]); // write the selected waveform on DAC1 + + i++; + if(i == maxSamplesNum) // Reset the counter to repeat the wave + i = 0; + + delayMicroseconds(sample); // Hold the sample value for the sample time +} + +// function hooked to the interrupt on digital pin 2 +void wave0Select() { + wave0++; + if(wave0 == 4) + wave0 = 0; +} + +// function hooked to the interrupt on digital pin 3 +void wave1Select() { + wave1++; + if(wave1 == 4) + wave1 = 0; +} +``` + +**Waveforms.h** + +```arduino + +#ifndef _Waveforms_h_ +#define _Waveforms_h_ + +#define maxWaveform 4 +#define maxSamplesNum 120 + +static int waveformsTable[maxWaveform][maxSamplesNum] = { + // Sin wave + { + 0x7ff, 0x86a, 0x8d5, 0x93f, 0x9a9, 0xa11, 0xa78, 0xadd, 0xb40, 0xba1, + 0xbff, 0xc5a, 0xcb2, 0xd08, 0xd59, 0xda7, 0xdf1, 0xe36, 0xe77, 0xeb4, + 0xeec, 0xf1f, 0xf4d, 0xf77, 0xf9a, 0xfb9, 0xfd2, 0xfe5, 0xff3, 0xffc, + 0xfff, 0xffc, 0xff3, 0xfe5, 0xfd2, 0xfb9, 0xf9a, 0xf77, 0xf4d, 0xf1f, + 0xeec, 0xeb4, 0xe77, 0xe36, 0xdf1, 0xda7, 0xd59, 0xd08, 0xcb2, 0xc5a, + 0xbff, 0xba1, 0xb40, 0xadd, 0xa78, 0xa11, 0x9a9, 0x93f, 0x8d5, 0x86a, + 0x7ff, 0x794, 0x729, 0x6bf, 0x655, 0x5ed, 0x586, 0x521, 0x4be, 0x45d, + 0x3ff, 0x3a4, 0x34c, 0x2f6, 0x2a5, 0x257, 0x20d, 0x1c8, 0x187, 0x14a, + 0x112, 0xdf, 0xb1, 0x87, 0x64, 0x45, 0x2c, 0x19, 0xb, 0x2, + 0x0, 0x2, 0xb, 0x19, 0x2c, 0x45, 0x64, 0x87, 0xb1, 0xdf, + 0x112, 0x14a, 0x187, 0x1c8, 0x20d, 0x257, 0x2a5, 0x2f6, 0x34c, 0x3a4, + 0x3ff, 0x45d, 0x4be, 0x521, 0x586, 0x5ed, 0x655, 0x6bf, 0x729, 0x794 + } + , + + // Triangular wave + { + 0x44, 0x88, 0xcc, 0x110, 0x154, 0x198, 0x1dc, 0x220, 0x264, 0x2a8, + 0x2ec, 0x330, 0x374, 0x3b8, 0x3fc, 0x440, 0x484, 0x4c8, 0x50c, 0x550, + 0x594, 0x5d8, 0x61c, 0x660, 0x6a4, 0x6e8, 0x72c, 0x770, 0x7b4, 0x7f8, + 0x83c, 0x880, 0x8c4, 0x908, 0x94c, 0x990, 0x9d4, 0xa18, 0xa5c, 0xaa0, + 0xae4, 0xb28, 0xb6c, 0xbb0, 0xbf4, 0xc38, 0xc7c, 0xcc0, 0xd04, 0xd48, + 0xd8c, 0xdd0, 0xe14, 0xe58, 0xe9c, 0xee0, 0xf24, 0xf68, 0xfac, 0xff0, + 0xfac, 0xf68, 0xf24, 0xee0, 0xe9c, 0xe58, 0xe14, 0xdd0, 0xd8c, 0xd48, + 0xd04, 0xcc0, 0xc7c, 0xc38, 0xbf4, 0xbb0, 0xb6c, 0xb28, 0xae4, 0xaa0, + 0xa5c, 0xa18, 0x9d4, 0x990, 0x94c, 0x908, 0x8c4, 0x880, 0x83c, 0x7f8, + 0x7b4, 0x770, 0x72c, 0x6e8, 0x6a4, 0x660, 0x61c, 0x5d8, 0x594, 0x550, + 0x50c, 0x4c8, 0x484, 0x440, 0x3fc, 0x3b8, 0x374, 0x330, 0x2ec, 0x2a8, + 0x264, 0x220, 0x1dc, 0x198, 0x154, 0x110, 0xcc, 0x88, 0x44, 0x0 + } + , + + // Sawtooth wave + { + 0x22, 0x44, 0x66, 0x88, 0xaa, 0xcc, 0xee, 0x110, 0x132, 0x154, + 0x176, 0x198, 0x1ba, 0x1dc, 0x1fe, 0x220, 0x242, 0x264, 0x286, 0x2a8, + 0x2ca, 0x2ec, 0x30e, 0x330, 0x352, 0x374, 0x396, 0x3b8, 0x3da, 0x3fc, + 0x41e, 0x440, 0x462, 0x484, 0x4a6, 0x4c8, 0x4ea, 0x50c, 0x52e, 0x550, + 0x572, 0x594, 0x5b6, 0x5d8, 0x5fa, 0x61c, 0x63e, 0x660, 0x682, 0x6a4, + 0x6c6, 0x6e8, 0x70a, 0x72c, 0x74e, 0x770, 0x792, 0x7b4, 0x7d6, 0x7f8, + 0x81a, 0x83c, 0x85e, 0x880, 0x8a2, 0x8c4, 0x8e6, 0x908, 0x92a, 0x94c, + 0x96e, 0x990, 0x9b2, 0x9d4, 0x9f6, 0xa18, 0xa3a, 0xa5c, 0xa7e, 0xaa0, + 0xac2, 0xae4, 0xb06, 0xb28, 0xb4a, 0xb6c, 0xb8e, 0xbb0, 0xbd2, 0xbf4, + 0xc16, 0xc38, 0xc5a, 0xc7c, 0xc9e, 0xcc0, 0xce2, 0xd04, 0xd26, 0xd48, + 0xd6a, 0xd8c, 0xdae, 0xdd0, 0xdf2, 0xe14, 0xe36, 0xe58, 0xe7a, 0xe9c, + 0xebe, 0xee0, 0xf02, 0xf24, 0xf46, 0xf68, 0xf8a, 0xfac, 0xfce, 0xff0 + } + , + + // Square wave + { + 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, + 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, + 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, + 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, + 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, + 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0 + } + +}; + +#endif +``` + + +## Testing It Out + +After you have uploaded the code, use the pushbuttons that you have hooked up to the breadboard to generate waveforms. If you have an oscilloscope, you can use it to visualize the different waveforms that you generate. You can control the signal frequency by using the potentiometer connected to `A0`. + +![Waveforms shown on an oscilloscope](assets/Duewaveforms.jpg) + + +### Troubleshoot + +If the code is not working, there are some common issues we can troubleshoot: + +- The wiring is incorrect. +- You have not installed or included all of the libraries. +- Make sure there are no missing curly brackets {}. +- We have not selected the right port and board. + + +## Conclusion + In this example, we have learned how to generate waveforms by using the DAC features of the Arduino Due. \ No newline at end of file diff --git a/content/hardware/09.mega/boards/due/tutorials/upgrading-16u2-due/assets/Due16U2UpgradeSPI.jpg b/content/hardware/10.mega/boards/due/tutorials/upgrading-16u2-due/assets/Due16U2UpgradeSPI.jpg similarity index 100% rename from content/hardware/09.mega/boards/due/tutorials/upgrading-16u2-due/assets/Due16U2UpgradeSPI.jpg rename to content/hardware/10.mega/boards/due/tutorials/upgrading-16u2-due/assets/Due16U2UpgradeSPI.jpg diff --git a/content/hardware/09.mega/boards/due/tutorials/upgrading-16u2-due/upgrading-16u2-due.md b/content/hardware/10.mega/boards/due/tutorials/upgrading-16u2-due/upgrading-16u2-due.md similarity index 97% rename from content/hardware/09.mega/boards/due/tutorials/upgrading-16u2-due/upgrading-16u2-due.md rename to content/hardware/10.mega/boards/due/tutorials/upgrading-16u2-due/upgrading-16u2-due.md index 3ff4f9d12a..736931626d 100644 --- a/content/hardware/09.mega/boards/due/tutorials/upgrading-16u2-due/upgrading-16u2-due.md +++ b/content/hardware/10.mega/boards/due/tutorials/upgrading-16u2-due/upgrading-16u2-due.md @@ -1,90 +1,90 @@ ---- -title: 'Upgrading Firmware of the Arduino Due Programming Port 16U2' -difficulty: beginner -compatible-products: [due] -description: 'In this tutorial you will update the ATmega16U2 firmware using an Arduino UNO or Mega as an AVR-ISP (in-system programmer).' -author: 'Arduino' -tags: - - Firmware -hardware: - - hardware/02.hero/boards/due -software: - - ide-v1 - - web-editor ---- - -## Introduction - -Behind the Arduino Due Programming port there is an AVR microcontroller (ATmega16U2) which converts the USB signals coming from the computer to the first serial port of the SAM3X. In this tutorial you will update the ATmega16U2 firmware using an Arduino UNO or Mega as an AVR-ISP (in-system programmer). - -## Instructions - -To use your Arduino board to burn a bootloader onto an AVR, you need to follow a few simple steps. - -**1.** Open the **ArduinoISP** sketch (in **Examples**) in the Arduino IDE. - -**2.** Select the items in the **Tools > Board** and **Serial Port** menus that correspond to the board you are using as the programmer (not the board being programmed). - -**3.** Upload the ArduinoISP sketch. - -**4.** Connect a 10uF (micro Farad) capacitor between the GND and RESET pin. - -**5.** Connect the following pins from the Arduino UNO (or Mega) to the ATmega16U2 ICSP connector: - -||UNO|Mega|16U2 ICSP| -|-|-|-|-| -|SCK|13|52|3| -|MISO|12|50|1| -|MOSI|11|51|4| -|Reset|10|10|5| -|GND|GND|GND|6| -|+5V|5V|5V|2| - -![The Pins of the Due board](./assets/Due16U2UpgradeSPI.jpg) - -The Arduino Due will take power from the Arduino UNO set as AVR programmer. If you want further details on the connections between the UNO/Mega and the ICSP connector of the target please look this tutorial: [Arduino as AVR-ISP](https://www.arduino.cc/en/Tutorial/ArduinoISP). - -## Upgrade the Firmware Using Avrdude - -To upgrade the firmware you need to use a command line tool called "avrdude", that is already included inside your IDE folder. You find it at the following path: `/path_to_arduino/arduino.1.5.x/hardware/tools` - - -The firmware to upload on the 16U2 is in a binary format that has the .hex extension. - -### Linux and Mac - -First thing to do is to go to the directory that contains the avrdude tools that comes with the IDE. For doing that, open a terminal window and type: - -`cd /home/USER/arduino-1.5.2/hardware/tools` - -the path to reach the Arduino directory depends on where you placed it. Then you can execute the avrdude tool specifying all the parameters you need to flash the firmware. Here is the complete line: - - -``` -/home/USER/arduino-1.5.2/hardware/tools$ ./avrdude -C avrdude.conf -c arduino -P /dev/ttyACM0 -b 19200 -p m16u2 -vvv -U flash:w:/home/USER/newFirmware/16u2.hex:i -``` - -### Windows - -First thing to do is to go to the directory that contains the avrdude tools that comes with the IDE. For doing that open a command prompt window clicking on Start and typing `cmd` then press enter. - -Once the command prompt is open should display a row like this: `C:\Users\USER` then type the following command to move inside the Arduino folder (it depends where you placed it): `cd arduino-1.5.2\hardware\tools`. - -the path to reach the Arduino directory depends where you placed it. Then you can execute the avrdude tool specifying all the parameters you need to flash the firmware. Here is the complete line: - - -``` -arduino-1.5.2/hardware/tool> avrdude.exe -C avrdude.conf -c arduino -P /dev/ttyACM0 -b 19200 -p m16u2 -vvv -U flash:w:/home/USER/newFirmware/16u2.hex:i -``` - -### Avrdude Parameter Explanations - -| | | -|-|-| -|`-C avrdude.conf`|load the configuration file for using the Arduino UNO as programmer| -|`-c arduino`|specify the programmer you want to use| -|`-P /dev/ttyACM0`|the usb port where the programmer is attached| -|`-b 19200`|the baudrate| -|`-p m16u2`|the target device you want to program| -|`-vvv`|enable the verbose output| -|`-U flash:w:/home/USER/newFirmware/16u2.hex:i`|specify that you want to write (w) the .hex file inside the flash memory| +--- +title: 'Upgrading Firmware of the Arduino Due Programming Port 16U2' +difficulty: beginner +compatible-products: [due] +description: 'In this tutorial you will update the ATmega16U2 firmware using an Arduino UNO or Mega as an AVR-ISP (in-system programmer).' +author: 'Arduino' +tags: + - Firmware +hardware: + - hardware/02.hero/boards/due +software: + - ide-v1 + - web-editor +--- + +## Introduction + +Behind the Arduino Due Programming port there is an AVR microcontroller (ATmega16U2) which converts the USB signals coming from the computer to the first serial port of the SAM3X. In this tutorial you will update the ATmega16U2 firmware using an Arduino UNO or Mega as an AVR-ISP (in-system programmer). + +## Instructions + +To use your Arduino board to burn a bootloader onto an AVR, you need to follow a few simple steps. + +**1.** Open the **ArduinoISP** sketch (in **Examples**) in the Arduino IDE. + +**2.** Select the items in the **Tools > Board** and **Serial Port** menus that correspond to the board you are using as the programmer (not the board being programmed). + +**3.** Upload the ArduinoISP sketch. + +**4.** Connect a 10uF (micro Farad) capacitor between the GND and RESET pin. + +**5.** Connect the following pins from the Arduino UNO (or Mega) to the ATmega16U2 ICSP connector: + +||UNO|Mega|16U2 ICSP| +|-|-|-|-| +|SCK|13|52|3| +|MISO|12|50|1| +|MOSI|11|51|4| +|Reset|10|10|5| +|GND|GND|GND|6| +|+5V|5V|5V|2| + +![The Pins of the Due board](./assets/Due16U2UpgradeSPI.jpg) + +The Arduino Due will take power from the Arduino UNO set as AVR programmer. If you want further details on the connections between the UNO/Mega and the ICSP connector of the target please look this tutorial: [Arduino as AVR-ISP](https://www.arduino.cc/en/Tutorial/ArduinoISP). + +## Upgrade the Firmware Using Avrdude + +To upgrade the firmware you need to use a command line tool called "avrdude", that is already included inside your IDE folder. You find it at the following path: `/path_to_arduino/arduino.1.5.x/hardware/tools` + + +The firmware to upload on the 16U2 is in a binary format that has the .hex extension. + +### Linux and Mac + +First thing to do is to go to the directory that contains the avrdude tools that comes with the IDE. For doing that, open a terminal window and type: + +`cd /home/USER/arduino-1.5.2/hardware/tools` + +the path to reach the Arduino directory depends on where you placed it. Then you can execute the avrdude tool specifying all the parameters you need to flash the firmware. Here is the complete line: + + +``` +/home/USER/arduino-1.5.2/hardware/tools$ ./avrdude -C avrdude.conf -c arduino -P /dev/ttyACM0 -b 19200 -p m16u2 -vvv -U flash:w:/home/USER/newFirmware/16u2.hex:i +``` + +### Windows + +First thing to do is to go to the directory that contains the avrdude tools that comes with the IDE. For doing that open a command prompt window clicking on Start and typing `cmd` then press enter. + +Once the command prompt is open should display a row like this: `C:\Users\USER` then type the following command to move inside the Arduino folder (it depends where you placed it): `cd arduino-1.5.2\hardware\tools`. + +the path to reach the Arduino directory depends where you placed it. Then you can execute the avrdude tool specifying all the parameters you need to flash the firmware. Here is the complete line: + + +``` +arduino-1.5.2/hardware/tool> avrdude.exe -C avrdude.conf -c arduino -P /dev/ttyACM0 -b 19200 -p m16u2 -vvv -U flash:w:/home/USER/newFirmware/16u2.hex:i +``` + +### Avrdude Parameter Explanations + +| | | +|-|-| +|`-C avrdude.conf`|load the configuration file for using the Arduino UNO as programmer| +|`-c arduino`|specify the programmer you want to use| +|`-P /dev/ttyACM0`|the usb port where the programmer is attached| +|`-b 19200`|the baudrate| +|`-p m16u2`|the target device you want to program| +|`-vvv`|enable the verbose output| +|`-U flash:w:/home/USER/newFirmware/16u2.hex:i`|specify that you want to write (w) the .hex file inside the flash memory| diff --git a/content/hardware/09.mega/boards/giga-r1-wifi/compatibility.yml b/content/hardware/10.mega/boards/giga-r1-wifi/compatibility.yml similarity index 100% rename from content/hardware/09.mega/boards/giga-r1-wifi/compatibility.yml rename to content/hardware/10.mega/boards/giga-r1-wifi/compatibility.yml diff --git a/content/hardware/09.mega/boards/giga-r1-wifi/datasheet/assets/GIGA_R1_WiFi_Block_Diagram.png b/content/hardware/10.mega/boards/giga-r1-wifi/datasheet/assets/GIGA_R1_WiFi_Block_Diagram.png similarity index 100% rename from content/hardware/09.mega/boards/giga-r1-wifi/datasheet/assets/GIGA_R1_WiFi_Block_Diagram.png rename to content/hardware/10.mega/boards/giga-r1-wifi/datasheet/assets/GIGA_R1_WiFi_Block_Diagram.png diff --git a/content/hardware/09.mega/boards/giga-r1-wifi/datasheet/assets/GIGA_R1_WiFi_Power_Tree.png b/content/hardware/10.mega/boards/giga-r1-wifi/datasheet/assets/GIGA_R1_WiFi_Power_Tree.png similarity index 100% rename from content/hardware/09.mega/boards/giga-r1-wifi/datasheet/assets/GIGA_R1_WiFi_Power_Tree.png rename to content/hardware/10.mega/boards/giga-r1-wifi/datasheet/assets/GIGA_R1_WiFi_Power_Tree.png diff --git a/content/hardware/09.mega/boards/giga-r1-wifi/datasheet/assets/featured.png b/content/hardware/10.mega/boards/giga-r1-wifi/datasheet/assets/featured.png similarity index 100% rename from content/hardware/09.mega/boards/giga-r1-wifi/datasheet/assets/featured.png rename to content/hardware/10.mega/boards/giga-r1-wifi/datasheet/assets/featured.png diff --git a/content/hardware/09.mega/boards/giga-r1-wifi/datasheet/assets/gigaMechanical.png b/content/hardware/10.mega/boards/giga-r1-wifi/datasheet/assets/gigaMechanical.png similarity index 100% rename from content/hardware/09.mega/boards/giga-r1-wifi/datasheet/assets/gigaMechanical.png rename to content/hardware/10.mega/boards/giga-r1-wifi/datasheet/assets/gigaMechanical.png diff --git a/content/hardware/09.mega/boards/giga-r1-wifi/datasheet/assets/gigaR1WiFiBottom.png b/content/hardware/10.mega/boards/giga-r1-wifi/datasheet/assets/gigaR1WiFiBottom.png similarity index 100% rename from content/hardware/09.mega/boards/giga-r1-wifi/datasheet/assets/gigaR1WiFiBottom.png rename to content/hardware/10.mega/boards/giga-r1-wifi/datasheet/assets/gigaR1WiFiBottom.png diff --git a/content/hardware/09.mega/boards/giga-r1-wifi/datasheet/assets/gigaR1WiFiTop.png b/content/hardware/10.mega/boards/giga-r1-wifi/datasheet/assets/gigaR1WiFiTop.png similarity index 100% rename from content/hardware/09.mega/boards/giga-r1-wifi/datasheet/assets/gigaR1WiFiTop.png rename to content/hardware/10.mega/boards/giga-r1-wifi/datasheet/assets/gigaR1WiFiTop.png diff --git a/content/hardware/09.mega/boards/giga-r1-wifi/datasheet/datasheet.md b/content/hardware/10.mega/boards/giga-r1-wifi/datasheet/datasheet.md similarity index 100% rename from content/hardware/09.mega/boards/giga-r1-wifi/datasheet/datasheet.md rename to content/hardware/10.mega/boards/giga-r1-wifi/datasheet/datasheet.md diff --git a/content/hardware/09.mega/boards/giga-r1-wifi/downloads/ABX00063-cad-files.zip b/content/hardware/10.mega/boards/giga-r1-wifi/downloads/ABX00063-cad-files.zip similarity index 100% rename from content/hardware/09.mega/boards/giga-r1-wifi/downloads/ABX00063-cad-files.zip rename to content/hardware/10.mega/boards/giga-r1-wifi/downloads/ABX00063-cad-files.zip diff --git a/content/hardware/09.mega/boards/giga-r1-wifi/downloads/ABX00063-full-pinout.pdf b/content/hardware/10.mega/boards/giga-r1-wifi/downloads/ABX00063-full-pinout.pdf similarity index 100% rename from content/hardware/09.mega/boards/giga-r1-wifi/downloads/ABX00063-full-pinout.pdf rename to content/hardware/10.mega/boards/giga-r1-wifi/downloads/ABX00063-full-pinout.pdf diff --git a/content/hardware/09.mega/boards/giga-r1-wifi/downloads/ABX00063-pinout.png b/content/hardware/10.mega/boards/giga-r1-wifi/downloads/ABX00063-pinout.png similarity index 100% rename from content/hardware/09.mega/boards/giga-r1-wifi/downloads/ABX00063-pinout.png rename to content/hardware/10.mega/boards/giga-r1-wifi/downloads/ABX00063-pinout.png diff --git a/content/hardware/09.mega/boards/giga-r1-wifi/downloads/ABX00063-schematics.pdf b/content/hardware/10.mega/boards/giga-r1-wifi/downloads/ABX00063-schematics.pdf similarity index 100% rename from content/hardware/09.mega/boards/giga-r1-wifi/downloads/ABX00063-schematics.pdf rename to content/hardware/10.mega/boards/giga-r1-wifi/downloads/ABX00063-schematics.pdf diff --git a/content/hardware/09.mega/boards/giga-r1-wifi/essentials.md b/content/hardware/10.mega/boards/giga-r1-wifi/essentials.md similarity index 100% rename from content/hardware/09.mega/boards/giga-r1-wifi/essentials.md rename to content/hardware/10.mega/boards/giga-r1-wifi/essentials.md diff --git a/content/hardware/09.mega/boards/giga-r1-wifi/features.md b/content/hardware/10.mega/boards/giga-r1-wifi/features.md similarity index 100% rename from content/hardware/09.mega/boards/giga-r1-wifi/features.md rename to content/hardware/10.mega/boards/giga-r1-wifi/features.md diff --git a/content/hardware/09.mega/boards/giga-r1-wifi/image.svg b/content/hardware/10.mega/boards/giga-r1-wifi/image.svg similarity index 100% rename from content/hardware/09.mega/boards/giga-r1-wifi/image.svg rename to content/hardware/10.mega/boards/giga-r1-wifi/image.svg diff --git a/content/hardware/09.mega/boards/giga-r1-wifi/interactive/ABX00063-pinout.png b/content/hardware/10.mega/boards/giga-r1-wifi/interactive/ABX00063-pinout.png similarity index 100% rename from content/hardware/09.mega/boards/giga-r1-wifi/interactive/ABX00063-pinout.png rename to content/hardware/10.mega/boards/giga-r1-wifi/interactive/ABX00063-pinout.png diff --git a/content/hardware/09.mega/boards/giga-r1-wifi/interactive/altium.zip b/content/hardware/10.mega/boards/giga-r1-wifi/interactive/altium.zip similarity index 100% rename from content/hardware/09.mega/boards/giga-r1-wifi/interactive/altium.zip rename to content/hardware/10.mega/boards/giga-r1-wifi/interactive/altium.zip diff --git a/content/hardware/09.mega/boards/giga-r1-wifi/product.md b/content/hardware/10.mega/boards/giga-r1-wifi/product.md similarity index 100% rename from content/hardware/09.mega/boards/giga-r1-wifi/product.md rename to content/hardware/10.mega/boards/giga-r1-wifi/product.md diff --git a/content/hardware/09.mega/boards/giga-r1-wifi/tech-specs.md b/content/hardware/10.mega/boards/giga-r1-wifi/tech-specs.md similarity index 100% rename from content/hardware/09.mega/boards/giga-r1-wifi/tech-specs.md rename to content/hardware/10.mega/boards/giga-r1-wifi/tech-specs.md diff --git a/content/hardware/09.mega/boards/giga-r1-wifi/tech-specs.yml b/content/hardware/10.mega/boards/giga-r1-wifi/tech-specs.yml similarity index 100% rename from content/hardware/09.mega/boards/giga-r1-wifi/tech-specs.yml rename to content/hardware/10.mega/boards/giga-r1-wifi/tech-specs.yml diff --git a/content/hardware/09.mega/boards/giga-r1-wifi/tutorials/cheat-sheet/assets/BOOT0.png b/content/hardware/10.mega/boards/giga-r1-wifi/tutorials/cheat-sheet/assets/BOOT0.png similarity index 100% rename from content/hardware/09.mega/boards/giga-r1-wifi/tutorials/cheat-sheet/assets/BOOT0.png rename to content/hardware/10.mega/boards/giga-r1-wifi/tutorials/cheat-sheet/assets/BOOT0.png diff --git a/content/hardware/09.mega/boards/giga-r1-wifi/tutorials/cheat-sheet/assets/STM32H747XI.png b/content/hardware/10.mega/boards/giga-r1-wifi/tutorials/cheat-sheet/assets/STM32H747XI.png similarity index 100% rename from content/hardware/09.mega/boards/giga-r1-wifi/tutorials/cheat-sheet/assets/STM32H747XI.png rename to content/hardware/10.mega/boards/giga-r1-wifi/tutorials/cheat-sheet/assets/STM32H747XI.png diff --git a/content/hardware/09.mega/boards/giga-r1-wifi/tutorials/cheat-sheet/assets/audio-jack.png b/content/hardware/10.mega/boards/giga-r1-wifi/tutorials/cheat-sheet/assets/audio-jack.png similarity index 100% rename from content/hardware/09.mega/boards/giga-r1-wifi/tutorials/cheat-sheet/assets/audio-jack.png rename to content/hardware/10.mega/boards/giga-r1-wifi/tutorials/cheat-sheet/assets/audio-jack.png diff --git a/content/hardware/09.mega/boards/giga-r1-wifi/tutorials/cheat-sheet/assets/canpins.png b/content/hardware/10.mega/boards/giga-r1-wifi/tutorials/cheat-sheet/assets/canpins.png similarity index 100% rename from content/hardware/09.mega/boards/giga-r1-wifi/tutorials/cheat-sheet/assets/canpins.png rename to content/hardware/10.mega/boards/giga-r1-wifi/tutorials/cheat-sheet/assets/canpins.png diff --git a/content/hardware/09.mega/boards/giga-r1-wifi/tutorials/cheat-sheet/assets/i2cpins.png b/content/hardware/10.mega/boards/giga-r1-wifi/tutorials/cheat-sheet/assets/i2cpins.png similarity index 100% rename from content/hardware/09.mega/boards/giga-r1-wifi/tutorials/cheat-sheet/assets/i2cpins.png rename to content/hardware/10.mega/boards/giga-r1-wifi/tutorials/cheat-sheet/assets/i2cpins.png diff --git a/content/hardware/09.mega/boards/giga-r1-wifi/tutorials/cheat-sheet/assets/jtag.png b/content/hardware/10.mega/boards/giga-r1-wifi/tutorials/cheat-sheet/assets/jtag.png similarity index 100% rename from content/hardware/09.mega/boards/giga-r1-wifi/tutorials/cheat-sheet/assets/jtag.png rename to content/hardware/10.mega/boards/giga-r1-wifi/tutorials/cheat-sheet/assets/jtag.png diff --git a/content/hardware/09.mega/boards/giga-r1-wifi/tutorials/cheat-sheet/assets/red_led_blink.gif b/content/hardware/10.mega/boards/giga-r1-wifi/tutorials/cheat-sheet/assets/red_led_blink.gif similarity index 100% rename from content/hardware/09.mega/boards/giga-r1-wifi/tutorials/cheat-sheet/assets/red_led_blink.gif rename to content/hardware/10.mega/boards/giga-r1-wifi/tutorials/cheat-sheet/assets/red_led_blink.gif diff --git a/content/hardware/09.mega/boards/giga-r1-wifi/tutorials/cheat-sheet/assets/rtc.png b/content/hardware/10.mega/boards/giga-r1-wifi/tutorials/cheat-sheet/assets/rtc.png similarity index 100% rename from content/hardware/09.mega/boards/giga-r1-wifi/tutorials/cheat-sheet/assets/rtc.png rename to content/hardware/10.mega/boards/giga-r1-wifi/tutorials/cheat-sheet/assets/rtc.png diff --git a/content/hardware/09.mega/boards/giga-r1-wifi/tutorials/cheat-sheet/assets/schematics-spi.png b/content/hardware/10.mega/boards/giga-r1-wifi/tutorials/cheat-sheet/assets/schematics-spi.png similarity index 100% rename from content/hardware/09.mega/boards/giga-r1-wifi/tutorials/cheat-sheet/assets/schematics-spi.png rename to content/hardware/10.mega/boards/giga-r1-wifi/tutorials/cheat-sheet/assets/schematics-spi.png diff --git a/content/hardware/09.mega/boards/giga-r1-wifi/tutorials/cheat-sheet/assets/spipins.png b/content/hardware/10.mega/boards/giga-r1-wifi/tutorials/cheat-sheet/assets/spipins.png similarity index 100% rename from content/hardware/09.mega/boards/giga-r1-wifi/tutorials/cheat-sheet/assets/spipins.png rename to content/hardware/10.mega/boards/giga-r1-wifi/tutorials/cheat-sheet/assets/spipins.png diff --git a/content/hardware/09.mega/boards/giga-r1-wifi/tutorials/cheat-sheet/assets/usb.png b/content/hardware/10.mega/boards/giga-r1-wifi/tutorials/cheat-sheet/assets/usb.png similarity index 100% rename from content/hardware/09.mega/boards/giga-r1-wifi/tutorials/cheat-sheet/assets/usb.png rename to content/hardware/10.mega/boards/giga-r1-wifi/tutorials/cheat-sheet/assets/usb.png diff --git a/content/hardware/09.mega/boards/giga-r1-wifi/tutorials/cheat-sheet/assets/wifi.png b/content/hardware/10.mega/boards/giga-r1-wifi/tutorials/cheat-sheet/assets/wifi.png similarity index 100% rename from content/hardware/09.mega/boards/giga-r1-wifi/tutorials/cheat-sheet/assets/wifi.png rename to content/hardware/10.mega/boards/giga-r1-wifi/tutorials/cheat-sheet/assets/wifi.png diff --git a/content/hardware/09.mega/boards/giga-r1-wifi/tutorials/cheat-sheet/cheat-sheet.md b/content/hardware/10.mega/boards/giga-r1-wifi/tutorials/cheat-sheet/cheat-sheet.md similarity index 100% rename from content/hardware/09.mega/boards/giga-r1-wifi/tutorials/cheat-sheet/cheat-sheet.md rename to content/hardware/10.mega/boards/giga-r1-wifi/tutorials/cheat-sheet/cheat-sheet.md diff --git a/content/hardware/09.mega/boards/giga-r1-wifi/tutorials/cheat-sheet/hero-banner.png b/content/hardware/10.mega/boards/giga-r1-wifi/tutorials/cheat-sheet/hero-banner.png similarity index 100% rename from content/hardware/09.mega/boards/giga-r1-wifi/tutorials/cheat-sheet/hero-banner.png rename to content/hardware/10.mega/boards/giga-r1-wifi/tutorials/cheat-sheet/hero-banner.png diff --git a/content/hardware/09.mega/boards/giga-r1-wifi/tutorials/giga-audio/assets/adcs.png b/content/hardware/10.mega/boards/giga-r1-wifi/tutorials/giga-audio/assets/adcs.png similarity index 100% rename from content/hardware/09.mega/boards/giga-r1-wifi/tutorials/giga-audio/assets/adcs.png rename to content/hardware/10.mega/boards/giga-r1-wifi/tutorials/giga-audio/assets/adcs.png diff --git a/content/hardware/09.mega/boards/giga-r1-wifi/tutorials/giga-audio/assets/audio-pins.png b/content/hardware/10.mega/boards/giga-r1-wifi/tutorials/giga-audio/assets/audio-pins.png similarity index 100% rename from content/hardware/09.mega/boards/giga-r1-wifi/tutorials/giga-audio/assets/audio-pins.png rename to content/hardware/10.mega/boards/giga-r1-wifi/tutorials/giga-audio/assets/audio-pins.png diff --git a/content/hardware/09.mega/boards/giga-r1-wifi/tutorials/giga-audio/assets/dacs-and-jack.png b/content/hardware/10.mega/boards/giga-r1-wifi/tutorials/giga-audio/assets/dacs-and-jack.png similarity index 100% rename from content/hardware/09.mega/boards/giga-r1-wifi/tutorials/giga-audio/assets/dacs-and-jack.png rename to content/hardware/10.mega/boards/giga-r1-wifi/tutorials/giga-audio/assets/dacs-and-jack.png diff --git a/content/hardware/09.mega/boards/giga-r1-wifi/tutorials/giga-audio/assets/jack-schematic-1.png b/content/hardware/10.mega/boards/giga-r1-wifi/tutorials/giga-audio/assets/jack-schematic-1.png similarity index 100% rename from content/hardware/09.mega/boards/giga-r1-wifi/tutorials/giga-audio/assets/jack-schematic-1.png rename to content/hardware/10.mega/boards/giga-r1-wifi/tutorials/giga-audio/assets/jack-schematic-1.png diff --git a/content/hardware/09.mega/boards/giga-r1-wifi/tutorials/giga-audio/assets/jack-schematic-2.png b/content/hardware/10.mega/boards/giga-r1-wifi/tutorials/giga-audio/assets/jack-schematic-2.png similarity index 100% rename from content/hardware/09.mega/boards/giga-r1-wifi/tutorials/giga-audio/assets/jack-schematic-2.png rename to content/hardware/10.mega/boards/giga-r1-wifi/tutorials/giga-audio/assets/jack-schematic-2.png diff --git a/content/hardware/09.mega/boards/giga-r1-wifi/tutorials/giga-audio/assets/jack-schematic-3.png b/content/hardware/10.mega/boards/giga-r1-wifi/tutorials/giga-audio/assets/jack-schematic-3.png similarity index 100% rename from content/hardware/09.mega/boards/giga-r1-wifi/tutorials/giga-audio/assets/jack-schematic-3.png rename to content/hardware/10.mega/boards/giga-r1-wifi/tutorials/giga-audio/assets/jack-schematic-3.png diff --git a/content/hardware/09.mega/boards/giga-r1-wifi/tutorials/giga-audio/content.md b/content/hardware/10.mega/boards/giga-r1-wifi/tutorials/giga-audio/content.md similarity index 97% rename from content/hardware/09.mega/boards/giga-r1-wifi/tutorials/giga-audio/content.md rename to content/hardware/10.mega/boards/giga-r1-wifi/tutorials/giga-audio/content.md index 058937af88..c35d0cac4e 100644 --- a/content/hardware/09.mega/boards/giga-r1-wifi/tutorials/giga-audio/content.md +++ b/content/hardware/10.mega/boards/giga-r1-wifi/tutorials/giga-audio/content.md @@ -1,916 +1,916 @@ ---- -title: Guide to GIGA R1 Advanced ADC/DAC and Audio Features -description: 'Learn how to use the ADC/DAC features, along with useful examples on how to generate waveforms and play audio from a file.' -author: José Bagur, Taddy Chung & Karl Söderby -tags: [ADC, DAC, Audio, USB] ---- - -In the GIGA R1, you can find the powerful STM32H747XI, a dual-core 32-bit Arm® Cortex® microcontroller from STMicroelectronics; this is the same microcontroller found in the [Portenta H7](/hardware/portenta-h7) board. - -In this guide, we will focus on the advanced ADC/DAC features, utilizing the [Arduino_AdvancedAnalog](https://github.com/arduino-libraries/Arduino_AdvancedAnalog) library. The examples found in this guide can be used to: -- Set up and read ADCs with specific parameters (resolution, sample rate, number of samples per channel, queue depth). -- Set up and write to a DAC channel with specific parameters (resolution, frequency, number of samples per channel, queue depth). -- Generate specific waveforms through input via serial commands (triangle, square, sine, sawtooth waves) as well as adjusting the frequency. -- Read and play audio files (`.wav`) from a USB stick (connected to USB-A) to a speaker, using the audio jack. - -***Important note: the GIGA R1 does NOT have an amplifying circuit onboard. Connecting speakers that does not have an amplifier can damage the DAC and the board itself.*** - -## Hardware & Software Needed - -- [GIGA R1 WiFi](/hardware/giga-r1). -- [Arduino IDE](https://www.arduino.cc/en/software) -- [Arduino_AdvancedAnalog](https://github.com/arduino-libraries/Arduino_AdvancedAnalog) library. - -And for specific examples: - -- USB Mass Storage Device (USB Stick). -- Auxiliary Cable. -- Speaker with a built-in amplifier. - -## ADC/DAC Pins and Connectors - -The GIGA gives you access to more pins than any other Arduino board accessible for makers. Many have unique features; we will focus on the pins that have audio features or can be used for developing audio applications. Audio pins and connectors in the GIGA can be divided into three important groups: - -- Analog-to-Digital Converters (ADC) pins -- Digital-to-Analog Converters (DAC) pins -- Tip, Ring, Ring, Sleeve (TRRS) 3.5mm jack - -The image below shows the position of the audio pins and connectors of the GIGA R1: - -![ADC/DAC pins and connectors of the GIGA R1](assets/audio-pins.png) - -The table below explains the full functionality of the listed on it; notice that some pins have more than one functionality, such as `DAC0`, `DAC1`, `CANRX`, and `CANTX`: - -| Pin | Functionality | -|:-----:|:--------------:| -| A0 | ADC | -| A1 | ADC | -| A2 | ADC | -| A3 | ADC | -| A4 | ADC | -| A5 | ADC | -| A6 | ADC | -| A7 | ADC | -| A8 | ADC | -| A9 | ADC | -| A10 | ADC | -| A11 | ADC | -| DAC0 | ADC and DAC | -| DAC1 | ADC and DAC | -| CANRX | ADC and CAN RX | -| CANTX | ADC and CAN TX | - -Pins `A7`, `DAC0`, and `DAC1` can also be accessed via the built-in TRRS 3.5mm jack. `DAC0` is connected to ring 1 (right channel), `DAC1` is connected to the tip (left channel), and `A7` is connected to ring 2 (microphone) of the jack, as shown in the schematic below: - -![GIGA R1 TRRS 3.5mm jack schematic](assets/jack-schematic-1.png) - -## Analog-to-Digital Converter (ADC) - -An analog-to-digital converter (ADC) is a device that converts an analog voltage, or signal, into digital data. The GIGA R1 microcontroller, the STM32H747XI, embeds three ADCs whose resolution can be configured to 8, 10, 12, 14, or 16 bits. Each ADC shares up to 20 external channels that can be accessed in the GIGA R1 board through pins `A0`, `A1`, `A2`, `A3`, `A4`, `A5`, `A6`, `A7`, `A8`, `A9`, `A10`, and `A11`; pins `DAC0`, `DAC1`, `CANRX`, and `CANTX` can also be used as ADCs. - -![ADC pins of the GIGA R1](assets/adcs.png) - -`A7` is connected to ring 2 (microphone) of the jack, as shown in the schematic below: - -![GIGA R1 3.5mm input jack schematic](assets/jack-schematic-2.png) - -The GIGA R1 ADCs can be used with the [built-in analog input/output functions of the Arduino programming language](https://www.arduino.cc/reference/de/language/functions/analog-io/analogread/), though they only provide the basic functionalities of the ADCs. To use all of the capabilities of the DACs from the GIGA R1, we can use the [Arduino_AdvancedAnalog](https://github.com/bcmi-labs/Arduino_AdvancedAnalog) library from Arduino. Let's check some interesting examples that show some capabilities of the GIGA R1 ADCs! - -### Multi Channel ADC - -The following example code show how to use two GIGA R1 ADCs simultaneously with the **Arduino_AdvancedAnalog** library from Arduino: - -```arduino -// This example shows how to use 2 ADC simultaneously. -#include - -AdvancedADC adc1(A0); -AdvancedADC adc2(A1); -uint64_t last_millis = 0; - -void setup() { - Serial.begin(9600); - - // Resolution, sample rate, number of samples per channel, queue depth. - if (!adc1.begin(AN_RESOLUTION_16, 16000, 32, 64)) { - Serial.println("Failed to start analog acquisition!"); - while (1); - } - - if (!adc2.begin(AN_RESOLUTION_16, 8000, 32, 64)) { - Serial.println("Failed to start analog acquisition!"); - while (1); - } -} - -void adc_print_buf(AdvancedADC &adc) { - if (adc.available()) { - SampleBuffer buf = adc.read(); - - // Print first sample. - Serial.println(buf[0]); - - // Release the buffer to return it to the pool. - buf.release(); - } -} - -void loop() { - if (millis() - last_millis > 1) { - adc_print_buf(adc1); - adc_print_buf(adc2); - last_millis = millis(); - } -} -``` - -### ADC Serial Plotter Example - -The following example code shows how to use two GIGA R1 ADCs simultaneously with the **Arduino_AdvancedAnalog** library from Arduino and displays the readings via the Serial Plotter of the Arduino IDE: - -```arduino -#include - -AdvancedADC adc(A0, A1); -uint64_t last_millis = 0; - -void setup() { - Serial.begin(9600); - - // Resolution, sample rate, number of samples per channel, queue depth. - if (!adc.begin(AN_RESOLUTION_16, 16000, 32, 128)) { - Serial.println("Failed to start analog acquisition!"); - while (1); - } -} - -void loop() { - if (adc.available()) { - SampleBuffer buf = adc.read(); - // Process the buffer. - if ((millis() - last_millis) > 20) { - Serial.println(buf[0]); // Sample from first channel - Serial.println(buf[1]); // Sample from second channel - last_millis = millis(); - } - // Release the buffer to return it to the pool. - buf.release(); - } -} -``` - -## Digital-to-Analog Converters (DAC) - -A digital-to-analog converter (DAC) is a device that has a function opposite to that of the analog-to-digital converter (ADC); a DAC converts digital data to an analog voltage. The GIGA R1 microcontroller, the STM32H747XI, features two 12-bit buffered DAC channels that can convert two digital signals into two analog voltage signals. Some of the features of the DACs found in the GIGA R1 are the following: - -- 8-bit or 12-bit monotonic output -- Left or right data alignment in 12-bit mode -- Dual DAC channel independent or simultaneous conversions -- DMA capability for each channel -- External triggers for conversion -- Input voltage reference or internal voltage reference -- Analog waveform generation - -The GIGA R1 DACs are named `DAC0` and `DAC1`; they can be found on pins `A12` and `A13` correspondingly, as shown in the image below: - -![DAC0, DAC1 and the 3.5mm input jack of the GIGA R1](assets/dacs-and-jack.png) - -Besides pins `A12` and `A13`, `DAC0` and `DAC1` can also be accessed via the built-in TRRS 3.5mm jack. `DAC0` is connected to the right channel (tip), while `DAC1` is connected to the left channel (ring) of the input jack as shown in the schematic below: - -![GIGA R1 3.5mm input jack schematic](assets/jack-schematic-3.png) - -### Waveform Generation with the GIGA R1 DACs - -Waveform generation is an exciting application used in audio systems, for example, synthesizers, for audio signal generation. - -The following example shows how to output an 8kHz square wave on `DAC0`: - -```arduino -// This example outputs an 8KHz square wave on A12/DAC0. -#include - -AdvancedDAC dac1(A12); - -void setup() { - Serial.begin(9600); - - while (!Serial) { - - } - - if (!dac1.begin(AN_RESOLUTION_12, 8000, 32, 64)) { - Serial.println("Failed to start DAC1 !"); - while (1); - } -} - -void dac_output_sq(AdvancedDAC &dac_out) { - if (dac_out.available()) { - - // Get a free buffer for writing. - SampleBuffer buf = dac_out.dequeue(); - - // Write data to buffer. - for (int i=0; i - -AdvancedDAC dac1(A12); -AdvancedDAC dac2(A13); - -void setup() { - Serial.begin(9600); - - while (!Serial) { - - } - - if (!dac1.begin(AN_RESOLUTION_12, 8000, 32, 64)) { - Serial.println("Failed to start DAC1 !"); - while (1); - } - - if (!dac2.begin(AN_RESOLUTION_12, 16000, 32, 64)) { - Serial.println("Failed to start DAC2 !"); - while (1); - } -} - -void dac_output_sq(AdvancedDAC &dac_out) { - if (dac_out.available()) { - - // Get a free buffer for writing. - SampleBuffer buf = dac_out.dequeue(); - - // Write data to buffer. - for (int i=0; i - -AdvancedDAC dac1(A12); - -uint16_t lut[] = { - 0x0800,0x08c8,0x098f,0x0a52,0x0b0f,0x0bc5,0x0c71,0x0d12,0x0da7,0x0e2e,0x0ea6,0x0f0d,0x0f63,0x0fa7,0x0fd8,0x0ff5, - 0x0fff,0x0ff5,0x0fd8,0x0fa7,0x0f63,0x0f0d,0x0ea6,0x0e2e,0x0da7,0x0d12,0x0c71,0x0bc5,0x0b0f,0x0a52,0x098f,0x08c8, - 0x0800,0x0737,0x0670,0x05ad,0x04f0,0x043a,0x038e,0x02ed,0x0258,0x01d1,0x0159,0x00f2,0x009c,0x0058,0x0027,0x000a, - 0x0000,0x000a,0x0027,0x0058,0x009c,0x00f2,0x0159,0x01d1,0x0258,0x02ed,0x038e,0x043a,0x04f0,0x05ad,0x0670,0x0737 -}; - -static size_t lut_size = sizeof(lut) / sizeof(lut[0]); - -void setup() { - Serial.begin(9600); - if (!dac1.begin(AN_RESOLUTION_12, 32000 * lut_size, 64, 128)) { - Serial.println("Failed to start DAC1 !"); - while (1); - } -} - -void loop() { - static size_t lut_offs = 0; - - if (dac1.available()) { - // Get a free buffer for writing. - SampleBuffer buf = dac1.dequeue(); - - // Write data to buffer. - for (size_t i=0; i - -#define N_SAMPLES (256) -#define DEFAULT_FREQUENCY (16000) - -AdvancedDAC dac1(A12); -uint8_t SAMPLES_BUFFER[N_SAMPLES]; -size_t dac_frequency = DEFAULT_FREQUENCY; - -void generate_waveform(int cmd) -{ - switch (cmd) { - case 't': - // Triangle wave - Serial.print("Waveform: Triangle "); - for (int i=0; i 1000) { - dac_frequency /= 2; - } else { - break; - } - - dac1.stop(); - delay(500); - if (!dac1.begin(AN_RESOLUTION_8, dac_frequency * N_SAMPLES, N_SAMPLES, 32)) { - Serial.println("Failed to start DAC1 !"); - } - delay(500); - break; - - default: - Serial.print("Unknown command "); - Serial.println((char) cmd); - return; - } - - Serial.print(dac_frequency/1000); - Serial.println("KHz"); -} - -void setup() { - Serial.begin(115200); - - while (!Serial) { - - } - - - Serial.println("Enter a command:"); - Serial.println("t: Triangle wave"); - Serial.println("q: Square wave"); - Serial.println("s: Sine wave"); - Serial.println("r: Sawtooth wave"); - Serial.println("+: Increase frequency"); - Serial.println("-: Decrease frequency"); - - generate_waveform('s'); - - // DAC initialization - if (!dac1.begin(AN_RESOLUTION_8, DEFAULT_FREQUENCY * N_SAMPLES, N_SAMPLES, 32)) { - Serial.println("Failed to start DAC1 !"); - while (1); - } -} - -void loop() { - if (Serial.available() > 0) { - int cmd = Serial.read(); - if (cmd != '\n') { - generate_waveform(cmd); - } - } - - if (dac1.available()) { - // Get a free buffer for writing. - SampleBuffer buf = dac1.dequeue(); - - // Write data to buffer. - for (size_t i=0; i -#include -#include -#include - -AdvancedDAC dac1(A12); - -USBHostMSD msd; -mbed::FATFileSystem usb("USB_DRIVE"); - -FILE * file = nullptr; -int sample_size = 0; -int samples_count = 0; - - -void setup() -{ - Serial.begin(115200); - while (!Serial); - - /* Enable power for HOST USB connector. */ - pinMode(PA_15, OUTPUT); - digitalWrite(PA_15, HIGH); - - Serial.println("Please connect a USB stick to the GIGA's USB port ..."); - while (!msd.connect()) delay(100); - - Serial.println("Mounting USB device ..."); - int const rc_mount = usb.mount(&msd); - if (rc_mount) - { - Serial.print("Error mounting USB device "); - Serial.println(rc_mount); - return; - } - - Serial.println("Opening audio file ..."); - - /* 16-bit PCM Mono 16kHz realigned noise reduction */ - file = fopen("/USB_DRIVE/AUDIO_SAMPLE.wav", "rb"); - if (file == nullptr) - { - Serial.print("Error opening audio file: "); - Serial.println(strerror(errno)); - return; - } - - Serial.println("Reading audio header ..."); - struct wav_header_t - { - char chunkID[4]; //"RIFF" = 0x46464952 - unsigned long chunkSize; //28 [+ sizeof(wExtraFormatBytes) + wExtraFormatBytes] + sum(sizeof(chunk.id) + sizeof(chunk.size) + chunk.size) - char format[4]; //"WAVE" = 0x45564157 - char subchunk1ID[4]; //"fmt " = 0x20746D66 - unsigned long subchunk1Size; //16 [+ sizeof(wExtraFormatBytes) + wExtraFormatBytes] - unsigned short audioFormat; - unsigned short numChannels; - unsigned long sampleRate; - unsigned long byteRate; - unsigned short blockAlign; - unsigned short bitsPerSample; - }; - - wav_header_t header; - fread(&header, sizeof(header), 1, file); - - Serial.println("WAV File Header read:"); - char msg[64] = {0}; - snprintf(msg, sizeof(msg), "File Type: %s", header.chunkID); - Serial.println(msg); - snprintf(msg, sizeof(msg), "File Size: %ld", header.chunkSize); - Serial.println(msg); - snprintf(msg, sizeof(msg), "WAV Marker: %s", header.format); - Serial.println(msg); - snprintf(msg, sizeof(msg), "Format Name: %s", header.subchunk1ID); - Serial.println(msg); - snprintf(msg, sizeof(msg), "Format Length: %ld", header.subchunk1Size); - Serial.println(msg); - snprintf(msg, sizeof(msg), "Format Type: %hd", header.audioFormat); - Serial.println(msg); - snprintf(msg, sizeof(msg), "Number of Channels: %hd", header.numChannels); - Serial.println(msg); - snprintf(msg, sizeof(msg), "Sample Rate: %ld", header.sampleRate); - Serial.println(msg); - snprintf(msg, sizeof(msg), "Sample Rate * Bits/Sample * Channels / 8: %ld", header.byteRate); - Serial.println(msg); - snprintf(msg, sizeof(msg), "Bits per Sample * Channels / 8: %hd", header.blockAlign); - Serial.println(msg); - snprintf(msg, sizeof(msg), "Bits per Sample: %hd", header.bitsPerSample); - Serial.println(msg); - - /* Find the data section of the WAV file. */ - struct chunk_t - { - char ID[4]; - unsigned long size; - }; - - chunk_t chunk; - snprintf(msg, sizeof(msg), "id\t" "size"); - Serial.println(msg); - /* Find data chunk. */ - while (true) - { - fread(&chunk, sizeof(chunk), 1, file); - snprintf(msg, sizeof(msg), "%c%c%c%c\t" "%li", chunk.ID[0], chunk.ID[1], chunk.ID[2], chunk.ID[3], chunk.size); - Serial.println(msg); - if (*(unsigned int *) &chunk.ID == 0x61746164) - break; - /* Skip chunk data bytes. */ - fseek(file, chunk.size, SEEK_CUR); - } - - /* Determine number of samples. */ - sample_size = header.bitsPerSample / 8; - samples_count = chunk.size * 8 / header.bitsPerSample; - snprintf(msg, sizeof(msg), "Sample size = %i", sample_size); Serial.println(msg); - snprintf(msg, sizeof(msg), "Samples count = %i", samples_count); Serial.println(msg); - - /* Configure the advanced DAC. */ - if (!dac1.begin(AN_RESOLUTION_12, header.sampleRate, 256, 16)) - { - Serial.println("Failed to start DAC1 !"); - return; - } -} - -void loop() -{ - if (dac1.available() && !feof(file)) - { - /* Read data from file. */ - uint16_t sample_data[256] = {0}; - fread(sample_data, sample_size, 256, file); - - /* Get a free buffer for writing. */ - SampleBuffer buf = dac1.dequeue(); - - /* Write data to buffer. */ - for (size_t i = 0; i < buf.size(); i++) - { - /* Scale down to 12 bit. */ - uint16_t const dac_val = ((static_cast(sample_data[i])+32768)>>4) & 0x0fff; - buf[i] = dac_val; - } - - /* Write the buffer to DAC. */ - dac1.write(buf); - } -} -``` - -### Loop Multiple Audio Files - -This example is similar to the **Play Single Audio File** example, but with some key changes: - -- This example uses multiple audio files. -- The file read is moved to a separate function, `configFile()`, as it will be continuously called from the sketch. -- Instead of playing a file once, it keeps looping it. -- The **BOOT0** (`PC_13`) button (right next to the audio jack) is used as a regular pushbutton to loop through the audio files. -- Pressing the button changes the file played. - -The files used are called `DRUM.wav`, `WARP.wav`, `BASS.wav` and `SHAKE.wav`. They are very short (around 1 second). These needs to be present on the USB stick used. - -You can download them from [this link](/resources/misc/giga_audio_examples.zip). - -```arduino -/* - * GIGA R1 - Audio Playback - * Simple wav format audio playback via 12-Bit DAC output by reading from a USB drive. - * In order for this sketch to work you need to rename 'USB_DRIVE' to the name of your USB stick drive. - * Furthermore you need to store the provided audio file AUDIO_SAMPLE.wav on it. -*/ - -#include -#include -#include -#include - -AdvancedDAC dac1(A12); - -USBHostMSD msd; -mbed::FATFileSystem usb("usb"); - -FILE *file = nullptr; -int sample_size = 0; -int samples_count = 0; - -int swapFile; - -void setup() { - Serial.begin(115200); - while (!Serial) - ; - - /* Enable power for HOST USB connector. */ - - pinMode(PA_15, OUTPUT); - digitalWrite(PA_15, HIGH); - - Serial.println("Please connect a USB stick to the GIGA's USB port ..."); - while (!msd.connect()) delay(100); - - Serial.println("Mounting USB device ..."); - int const rc_mount = usb.mount(&msd); - if (rc_mount) { - Serial.print("Error mounting USB device "); - Serial.println(rc_mount); - return; - } - configFile(); -} - -void loop() { - if (dac1.available() && !feof(file)) { - /* Read data from file. */ - uint16_t sample_data[256] = { 0 }; - fread(sample_data, sample_size, 256, file); - - /* Get a free buffer for writing. */ - SampleBuffer buf = dac1.dequeue(); - - /* Write data to buffer. */ - for (size_t i = 0; i < buf.size(); i++) { - /* Scale down to 12 bit. */ - uint16_t const dac_val = ((static_cast(sample_data[i]) + 32768) >> 4) & 0x0fff; - buf[i] = dac_val; - } - - /* Write the buffer to DAC. */ - dac1.write(buf); - - if(feof(file)){ - fclose(file); - configFile(); - } - } - - int buttonState = digitalRead(PC_13); - - if (buttonState == 1) { - swapFile = swapFile + 1; - if (swapFile == 4) { - swapFile = 0; - } - delay(500); - configFile(); - } -} - - -void configFile() { - Serial.println("Opening audio file ..."); - - /* 16-bit PCM Mono 16kHz realigned noise reduction */ - if (swapFile == 0) { - file = fopen("/usb/DRUM.wav", "rb"); - } else if (swapFile == 1) { - file = fopen("/usb/WARP.wav", "rb"); - } else if (swapFile == 2) { - file = fopen("/usb/BASS.wav", "rb"); - } else if (swapFile == 3) { - file = fopen("/usb/SHAKE.wav", "rb"); - } - - if (file == nullptr) { - Serial.print("Error opening audio file: "); - Serial.println(strerror(errno)); - return; - } - - Serial.println("Reading audio header ..."); - struct wav_header_t { - char chunkID[4]; //"RIFF" = 0x46464952 - unsigned long chunkSize; //28 [+ sizeof(wExtraFormatBytes) + wExtraFormatBytes] + sum(sizeof(chunk.id) + sizeof(chunk.size) + chunk.size) - char format[4]; //"WAVE" = 0x45564157 - char subchunk1ID[4]; //"fmt " = 0x20746D66 - unsigned long subchunk1Size; //16 [+ sizeof(wExtraFormatBytes) + wExtraFormatBytes] - unsigned short audioFormat; - unsigned short numChannels; - unsigned long sampleRate; - unsigned long byteRate; - unsigned short blockAlign; - unsigned short bitsPerSample; - }; - - wav_header_t header; - fread(&header, sizeof(header), 1, file); - - Serial.println("WAV File Header read:"); - char msg[64] = { 0 }; - snprintf(msg, sizeof(msg), "File Type: %s", header.chunkID); - Serial.println(msg); - snprintf(msg, sizeof(msg), "File Size: %ld", header.chunkSize); - Serial.println(msg); - snprintf(msg, sizeof(msg), "WAV Marker: %s", header.format); - Serial.println(msg); - snprintf(msg, sizeof(msg), "Format Name: %s", header.subchunk1ID); - Serial.println(msg); - snprintf(msg, sizeof(msg), "Format Length: %ld", header.subchunk1Size); - Serial.println(msg); - snprintf(msg, sizeof(msg), "Format Type: %hd", header.audioFormat); - Serial.println(msg); - snprintf(msg, sizeof(msg), "Number of Channels: %hd", header.numChannels); - Serial.println(msg); - snprintf(msg, sizeof(msg), "Sample Rate: %ld", header.sampleRate); - Serial.println(msg); - snprintf(msg, sizeof(msg), "Sample Rate * Bits/Sample * Channels / 8: %ld", header.byteRate); - Serial.println(msg); - snprintf(msg, sizeof(msg), "Bits per Sample * Channels / 8: %hd", header.blockAlign); - Serial.println(msg); - snprintf(msg, sizeof(msg), "Bits per Sample: %hd", header.bitsPerSample); - Serial.println(msg); - - /* Find the data section of the WAV file. */ - struct chunk_t { - char ID[4]; - unsigned long size; - }; - - chunk_t chunk; - snprintf(msg, sizeof(msg), "id\t" - "size"); - Serial.println(msg); - /* Find data chunk. */ - while (true) { - fread(&chunk, sizeof(chunk), 1, file); - snprintf(msg, sizeof(msg), "%c%c%c%c\t" - "%li", - chunk.ID[0], chunk.ID[1], chunk.ID[2], chunk.ID[3], chunk.size); - Serial.println(msg); - if (*(unsigned int *)&chunk.ID == 0x61746164) - break; - /* Skip chunk data bytes. */ - fseek(file, chunk.size, SEEK_CUR); - } - - /* Determine number of samples. */ - sample_size = header.bitsPerSample / 8; - samples_count = chunk.size * 8 / header.bitsPerSample; - snprintf(msg, sizeof(msg), "Sample size = %i", sample_size); - Serial.println(msg); - snprintf(msg, sizeof(msg), "Samples count = %i", samples_count); - Serial.println(msg); - - /* Configure the advanced DAC. */ - if (!dac1.begin(AN_RESOLUTION_12, header.sampleRate, 256, 16)) { - Serial.println("Failed to start DAC1 !"); - return; - } -} -``` - -## Pulse Density Modulation Support - -Pulse Density Support (PDM) is a form of modulation used to represent analog information into digital information; PDM uses a high-frequency stream of 1-bit digital samples. In PDM, a large cluster of ones represents a positive amplitude, while a large cluster of zeros represents a negative amplitude. - -The GIGA R1 PDM support can be used with the [built-in PDM library](https://docs.arduino.cc/learn/built-in-libraries/pdm). Let's check an interesting example that shows of how to read a PDM microphone wwith the GIGA R1: - -```arduino -#include - -// Default number of output channels -static const char channels = 1; - -// Default PCM output frequency -static const int frequency = 16000; - -// Buffer to read samples into, each sample is 16-bits -short sampleBuffer[128]; - -// Number of audio samples read -volatile int samplesRead; - -void setup() { - Serial.begin(9600); - while (!Serial); - - // Configure the callback function and gain - PDM.onReceive(onPDMdata); - PDM.setGain(30); - - // Initialize PDM microphone in mono mode, and a 16 kHz sample rate: - if (!PDM.begin(channels, frequency)) { - Serial.println("Failed to start PDM!"); - while (1); - } -} - -void loop() { - // Wait for samples to be read - if (samplesRead) { - - // Print samples to the Serial Monitor - for (int i = 0; i < samplesRead; i++) { - if(channels == 2) { - Serial.print("L:"); - Serial.print(sampleBuffer[i]); - Serial.print(" R:"); - i++; - } - Serial.println(sampleBuffer[i]); - } - - samplesRead = 0; - } -} - -// Callback function -void onPDMdata() { - int bytesAvailable = PDM.available(); - PDM.read(sampleBuffer, bytesAvailable); - samplesRead = bytesAvailable / 2; -} +--- +title: Guide to GIGA R1 Advanced ADC/DAC and Audio Features +description: 'Learn how to use the ADC/DAC features, along with useful examples on how to generate waveforms and play audio from a file.' +author: José Bagur, Taddy Chung & Karl Söderby +tags: [ADC, DAC, Audio, USB] +--- + +In the GIGA R1, you can find the powerful STM32H747XI, a dual-core 32-bit Arm® Cortex® microcontroller from STMicroelectronics; this is the same microcontroller found in the [Portenta H7](/hardware/portenta-h7) board. + +In this guide, we will focus on the advanced ADC/DAC features, utilizing the [Arduino_AdvancedAnalog](https://github.com/arduino-libraries/Arduino_AdvancedAnalog) library. The examples found in this guide can be used to: +- Set up and read ADCs with specific parameters (resolution, sample rate, number of samples per channel, queue depth). +- Set up and write to a DAC channel with specific parameters (resolution, frequency, number of samples per channel, queue depth). +- Generate specific waveforms through input via serial commands (triangle, square, sine, sawtooth waves) as well as adjusting the frequency. +- Read and play audio files (`.wav`) from a USB stick (connected to USB-A) to a speaker, using the audio jack. + +***Important note: the GIGA R1 does NOT have an amplifying circuit onboard. Connecting speakers that does not have an amplifier can damage the DAC and the board itself.*** + +## Hardware & Software Needed + +- [GIGA R1 WiFi](/hardware/giga-r1). +- [Arduino IDE](https://www.arduino.cc/en/software) +- [Arduino_AdvancedAnalog](https://github.com/arduino-libraries/Arduino_AdvancedAnalog) library. + +And for specific examples: + +- USB Mass Storage Device (USB Stick). +- Auxiliary Cable. +- Speaker with a built-in amplifier. + +## ADC/DAC Pins and Connectors + +The GIGA gives you access to more pins than any other Arduino board accessible for makers. Many have unique features; we will focus on the pins that have audio features or can be used for developing audio applications. Audio pins and connectors in the GIGA can be divided into three important groups: + +- Analog-to-Digital Converters (ADC) pins +- Digital-to-Analog Converters (DAC) pins +- Tip, Ring, Ring, Sleeve (TRRS) 3.5mm jack + +The image below shows the position of the audio pins and connectors of the GIGA R1: + +![ADC/DAC pins and connectors of the GIGA R1](assets/audio-pins.png) + +The table below explains the full functionality of the listed on it; notice that some pins have more than one functionality, such as `DAC0`, `DAC1`, `CANRX`, and `CANTX`: + +| Pin | Functionality | +|:-----:|:--------------:| +| A0 | ADC | +| A1 | ADC | +| A2 | ADC | +| A3 | ADC | +| A4 | ADC | +| A5 | ADC | +| A6 | ADC | +| A7 | ADC | +| A8 | ADC | +| A9 | ADC | +| A10 | ADC | +| A11 | ADC | +| DAC0 | ADC and DAC | +| DAC1 | ADC and DAC | +| CANRX | ADC and CAN RX | +| CANTX | ADC and CAN TX | + +Pins `A7`, `DAC0`, and `DAC1` can also be accessed via the built-in TRRS 3.5mm jack. `DAC0` is connected to ring 1 (right channel), `DAC1` is connected to the tip (left channel), and `A7` is connected to ring 2 (microphone) of the jack, as shown in the schematic below: + +![GIGA R1 TRRS 3.5mm jack schematic](assets/jack-schematic-1.png) + +## Analog-to-Digital Converter (ADC) + +An analog-to-digital converter (ADC) is a device that converts an analog voltage, or signal, into digital data. The GIGA R1 microcontroller, the STM32H747XI, embeds three ADCs whose resolution can be configured to 8, 10, 12, 14, or 16 bits. Each ADC shares up to 20 external channels that can be accessed in the GIGA R1 board through pins `A0`, `A1`, `A2`, `A3`, `A4`, `A5`, `A6`, `A7`, `A8`, `A9`, `A10`, and `A11`; pins `DAC0`, `DAC1`, `CANRX`, and `CANTX` can also be used as ADCs. + +![ADC pins of the GIGA R1](assets/adcs.png) + +`A7` is connected to ring 2 (microphone) of the jack, as shown in the schematic below: + +![GIGA R1 3.5mm input jack schematic](assets/jack-schematic-2.png) + +The GIGA R1 ADCs can be used with the [built-in analog input/output functions of the Arduino programming language](https://www.arduino.cc/reference/de/language/functions/analog-io/analogread/), though they only provide the basic functionalities of the ADCs. To use all of the capabilities of the DACs from the GIGA R1, we can use the [Arduino_AdvancedAnalog](https://github.com/bcmi-labs/Arduino_AdvancedAnalog) library from Arduino. Let's check some interesting examples that show some capabilities of the GIGA R1 ADCs! + +### Multi Channel ADC + +The following example code show how to use two GIGA R1 ADCs simultaneously with the **Arduino_AdvancedAnalog** library from Arduino: + +```arduino +// This example shows how to use 2 ADC simultaneously. +#include + +AdvancedADC adc1(A0); +AdvancedADC adc2(A1); +uint64_t last_millis = 0; + +void setup() { + Serial.begin(9600); + + // Resolution, sample rate, number of samples per channel, queue depth. + if (!adc1.begin(AN_RESOLUTION_16, 16000, 32, 64)) { + Serial.println("Failed to start analog acquisition!"); + while (1); + } + + if (!adc2.begin(AN_RESOLUTION_16, 8000, 32, 64)) { + Serial.println("Failed to start analog acquisition!"); + while (1); + } +} + +void adc_print_buf(AdvancedADC &adc) { + if (adc.available()) { + SampleBuffer buf = adc.read(); + + // Print first sample. + Serial.println(buf[0]); + + // Release the buffer to return it to the pool. + buf.release(); + } +} + +void loop() { + if (millis() - last_millis > 1) { + adc_print_buf(adc1); + adc_print_buf(adc2); + last_millis = millis(); + } +} +``` + +### ADC Serial Plotter Example + +The following example code shows how to use two GIGA R1 ADCs simultaneously with the **Arduino_AdvancedAnalog** library from Arduino and displays the readings via the Serial Plotter of the Arduino IDE: + +```arduino +#include + +AdvancedADC adc(A0, A1); +uint64_t last_millis = 0; + +void setup() { + Serial.begin(9600); + + // Resolution, sample rate, number of samples per channel, queue depth. + if (!adc.begin(AN_RESOLUTION_16, 16000, 32, 128)) { + Serial.println("Failed to start analog acquisition!"); + while (1); + } +} + +void loop() { + if (adc.available()) { + SampleBuffer buf = adc.read(); + // Process the buffer. + if ((millis() - last_millis) > 20) { + Serial.println(buf[0]); // Sample from first channel + Serial.println(buf[1]); // Sample from second channel + last_millis = millis(); + } + // Release the buffer to return it to the pool. + buf.release(); + } +} +``` + +## Digital-to-Analog Converters (DAC) + +A digital-to-analog converter (DAC) is a device that has a function opposite to that of the analog-to-digital converter (ADC); a DAC converts digital data to an analog voltage. The GIGA R1 microcontroller, the STM32H747XI, features two 12-bit buffered DAC channels that can convert two digital signals into two analog voltage signals. Some of the features of the DACs found in the GIGA R1 are the following: + +- 8-bit or 12-bit monotonic output +- Left or right data alignment in 12-bit mode +- Dual DAC channel independent or simultaneous conversions +- DMA capability for each channel +- External triggers for conversion +- Input voltage reference or internal voltage reference +- Analog waveform generation + +The GIGA R1 DACs are named `DAC0` and `DAC1`; they can be found on pins `A12` and `A13` correspondingly, as shown in the image below: + +![DAC0, DAC1 and the 3.5mm input jack of the GIGA R1](assets/dacs-and-jack.png) + +Besides pins `A12` and `A13`, `DAC0` and `DAC1` can also be accessed via the built-in TRRS 3.5mm jack. `DAC0` is connected to the right channel (tip), while `DAC1` is connected to the left channel (ring) of the input jack as shown in the schematic below: + +![GIGA R1 3.5mm input jack schematic](assets/jack-schematic-3.png) + +### Waveform Generation with the GIGA R1 DACs + +Waveform generation is an exciting application used in audio systems, for example, synthesizers, for audio signal generation. + +The following example shows how to output an 8kHz square wave on `DAC0`: + +```arduino +// This example outputs an 8KHz square wave on A12/DAC0. +#include + +AdvancedDAC dac1(A12); + +void setup() { + Serial.begin(9600); + + while (!Serial) { + + } + + if (!dac1.begin(AN_RESOLUTION_12, 8000, 32, 64)) { + Serial.println("Failed to start DAC1 !"); + while (1); + } +} + +void dac_output_sq(AdvancedDAC &dac_out) { + if (dac_out.available()) { + + // Get a free buffer for writing. + SampleBuffer buf = dac_out.dequeue(); + + // Write data to buffer. + for (int i=0; i + +AdvancedDAC dac1(A12); +AdvancedDAC dac2(A13); + +void setup() { + Serial.begin(9600); + + while (!Serial) { + + } + + if (!dac1.begin(AN_RESOLUTION_12, 8000, 32, 64)) { + Serial.println("Failed to start DAC1 !"); + while (1); + } + + if (!dac2.begin(AN_RESOLUTION_12, 16000, 32, 64)) { + Serial.println("Failed to start DAC2 !"); + while (1); + } +} + +void dac_output_sq(AdvancedDAC &dac_out) { + if (dac_out.available()) { + + // Get a free buffer for writing. + SampleBuffer buf = dac_out.dequeue(); + + // Write data to buffer. + for (int i=0; i + +AdvancedDAC dac1(A12); + +uint16_t lut[] = { + 0x0800,0x08c8,0x098f,0x0a52,0x0b0f,0x0bc5,0x0c71,0x0d12,0x0da7,0x0e2e,0x0ea6,0x0f0d,0x0f63,0x0fa7,0x0fd8,0x0ff5, + 0x0fff,0x0ff5,0x0fd8,0x0fa7,0x0f63,0x0f0d,0x0ea6,0x0e2e,0x0da7,0x0d12,0x0c71,0x0bc5,0x0b0f,0x0a52,0x098f,0x08c8, + 0x0800,0x0737,0x0670,0x05ad,0x04f0,0x043a,0x038e,0x02ed,0x0258,0x01d1,0x0159,0x00f2,0x009c,0x0058,0x0027,0x000a, + 0x0000,0x000a,0x0027,0x0058,0x009c,0x00f2,0x0159,0x01d1,0x0258,0x02ed,0x038e,0x043a,0x04f0,0x05ad,0x0670,0x0737 +}; + +static size_t lut_size = sizeof(lut) / sizeof(lut[0]); + +void setup() { + Serial.begin(9600); + if (!dac1.begin(AN_RESOLUTION_12, 32000 * lut_size, 64, 128)) { + Serial.println("Failed to start DAC1 !"); + while (1); + } +} + +void loop() { + static size_t lut_offs = 0; + + if (dac1.available()) { + // Get a free buffer for writing. + SampleBuffer buf = dac1.dequeue(); + + // Write data to buffer. + for (size_t i=0; i + +#define N_SAMPLES (256) +#define DEFAULT_FREQUENCY (16000) + +AdvancedDAC dac1(A12); +uint8_t SAMPLES_BUFFER[N_SAMPLES]; +size_t dac_frequency = DEFAULT_FREQUENCY; + +void generate_waveform(int cmd) +{ + switch (cmd) { + case 't': + // Triangle wave + Serial.print("Waveform: Triangle "); + for (int i=0; i 1000) { + dac_frequency /= 2; + } else { + break; + } + + dac1.stop(); + delay(500); + if (!dac1.begin(AN_RESOLUTION_8, dac_frequency * N_SAMPLES, N_SAMPLES, 32)) { + Serial.println("Failed to start DAC1 !"); + } + delay(500); + break; + + default: + Serial.print("Unknown command "); + Serial.println((char) cmd); + return; + } + + Serial.print(dac_frequency/1000); + Serial.println("KHz"); +} + +void setup() { + Serial.begin(115200); + + while (!Serial) { + + } + + + Serial.println("Enter a command:"); + Serial.println("t: Triangle wave"); + Serial.println("q: Square wave"); + Serial.println("s: Sine wave"); + Serial.println("r: Sawtooth wave"); + Serial.println("+: Increase frequency"); + Serial.println("-: Decrease frequency"); + + generate_waveform('s'); + + // DAC initialization + if (!dac1.begin(AN_RESOLUTION_8, DEFAULT_FREQUENCY * N_SAMPLES, N_SAMPLES, 32)) { + Serial.println("Failed to start DAC1 !"); + while (1); + } +} + +void loop() { + if (Serial.available() > 0) { + int cmd = Serial.read(); + if (cmd != '\n') { + generate_waveform(cmd); + } + } + + if (dac1.available()) { + // Get a free buffer for writing. + SampleBuffer buf = dac1.dequeue(); + + // Write data to buffer. + for (size_t i=0; i +#include +#include +#include + +AdvancedDAC dac1(A12); + +USBHostMSD msd; +mbed::FATFileSystem usb("USB_DRIVE"); + +FILE * file = nullptr; +int sample_size = 0; +int samples_count = 0; + + +void setup() +{ + Serial.begin(115200); + while (!Serial); + + /* Enable power for HOST USB connector. */ + pinMode(PA_15, OUTPUT); + digitalWrite(PA_15, HIGH); + + Serial.println("Please connect a USB stick to the GIGA's USB port ..."); + while (!msd.connect()) delay(100); + + Serial.println("Mounting USB device ..."); + int const rc_mount = usb.mount(&msd); + if (rc_mount) + { + Serial.print("Error mounting USB device "); + Serial.println(rc_mount); + return; + } + + Serial.println("Opening audio file ..."); + + /* 16-bit PCM Mono 16kHz realigned noise reduction */ + file = fopen("/USB_DRIVE/AUDIO_SAMPLE.wav", "rb"); + if (file == nullptr) + { + Serial.print("Error opening audio file: "); + Serial.println(strerror(errno)); + return; + } + + Serial.println("Reading audio header ..."); + struct wav_header_t + { + char chunkID[4]; //"RIFF" = 0x46464952 + unsigned long chunkSize; //28 [+ sizeof(wExtraFormatBytes) + wExtraFormatBytes] + sum(sizeof(chunk.id) + sizeof(chunk.size) + chunk.size) + char format[4]; //"WAVE" = 0x45564157 + char subchunk1ID[4]; //"fmt " = 0x20746D66 + unsigned long subchunk1Size; //16 [+ sizeof(wExtraFormatBytes) + wExtraFormatBytes] + unsigned short audioFormat; + unsigned short numChannels; + unsigned long sampleRate; + unsigned long byteRate; + unsigned short blockAlign; + unsigned short bitsPerSample; + }; + + wav_header_t header; + fread(&header, sizeof(header), 1, file); + + Serial.println("WAV File Header read:"); + char msg[64] = {0}; + snprintf(msg, sizeof(msg), "File Type: %s", header.chunkID); + Serial.println(msg); + snprintf(msg, sizeof(msg), "File Size: %ld", header.chunkSize); + Serial.println(msg); + snprintf(msg, sizeof(msg), "WAV Marker: %s", header.format); + Serial.println(msg); + snprintf(msg, sizeof(msg), "Format Name: %s", header.subchunk1ID); + Serial.println(msg); + snprintf(msg, sizeof(msg), "Format Length: %ld", header.subchunk1Size); + Serial.println(msg); + snprintf(msg, sizeof(msg), "Format Type: %hd", header.audioFormat); + Serial.println(msg); + snprintf(msg, sizeof(msg), "Number of Channels: %hd", header.numChannels); + Serial.println(msg); + snprintf(msg, sizeof(msg), "Sample Rate: %ld", header.sampleRate); + Serial.println(msg); + snprintf(msg, sizeof(msg), "Sample Rate * Bits/Sample * Channels / 8: %ld", header.byteRate); + Serial.println(msg); + snprintf(msg, sizeof(msg), "Bits per Sample * Channels / 8: %hd", header.blockAlign); + Serial.println(msg); + snprintf(msg, sizeof(msg), "Bits per Sample: %hd", header.bitsPerSample); + Serial.println(msg); + + /* Find the data section of the WAV file. */ + struct chunk_t + { + char ID[4]; + unsigned long size; + }; + + chunk_t chunk; + snprintf(msg, sizeof(msg), "id\t" "size"); + Serial.println(msg); + /* Find data chunk. */ + while (true) + { + fread(&chunk, sizeof(chunk), 1, file); + snprintf(msg, sizeof(msg), "%c%c%c%c\t" "%li", chunk.ID[0], chunk.ID[1], chunk.ID[2], chunk.ID[3], chunk.size); + Serial.println(msg); + if (*(unsigned int *) &chunk.ID == 0x61746164) + break; + /* Skip chunk data bytes. */ + fseek(file, chunk.size, SEEK_CUR); + } + + /* Determine number of samples. */ + sample_size = header.bitsPerSample / 8; + samples_count = chunk.size * 8 / header.bitsPerSample; + snprintf(msg, sizeof(msg), "Sample size = %i", sample_size); Serial.println(msg); + snprintf(msg, sizeof(msg), "Samples count = %i", samples_count); Serial.println(msg); + + /* Configure the advanced DAC. */ + if (!dac1.begin(AN_RESOLUTION_12, header.sampleRate, 256, 16)) + { + Serial.println("Failed to start DAC1 !"); + return; + } +} + +void loop() +{ + if (dac1.available() && !feof(file)) + { + /* Read data from file. */ + uint16_t sample_data[256] = {0}; + fread(sample_data, sample_size, 256, file); + + /* Get a free buffer for writing. */ + SampleBuffer buf = dac1.dequeue(); + + /* Write data to buffer. */ + for (size_t i = 0; i < buf.size(); i++) + { + /* Scale down to 12 bit. */ + uint16_t const dac_val = ((static_cast(sample_data[i])+32768)>>4) & 0x0fff; + buf[i] = dac_val; + } + + /* Write the buffer to DAC. */ + dac1.write(buf); + } +} +``` + +### Loop Multiple Audio Files + +This example is similar to the **Play Single Audio File** example, but with some key changes: + +- This example uses multiple audio files. +- The file read is moved to a separate function, `configFile()`, as it will be continuously called from the sketch. +- Instead of playing a file once, it keeps looping it. +- The **BOOT0** (`PC_13`) button (right next to the audio jack) is used as a regular pushbutton to loop through the audio files. +- Pressing the button changes the file played. + +The files used are called `DRUM.wav`, `WARP.wav`, `BASS.wav` and `SHAKE.wav`. They are very short (around 1 second). These needs to be present on the USB stick used. + +You can download them from [this link](/resources/misc/giga_audio_examples.zip). + +```arduino +/* + * GIGA R1 - Audio Playback + * Simple wav format audio playback via 12-Bit DAC output by reading from a USB drive. + * In order for this sketch to work you need to rename 'USB_DRIVE' to the name of your USB stick drive. + * Furthermore you need to store the provided audio file AUDIO_SAMPLE.wav on it. +*/ + +#include +#include +#include +#include + +AdvancedDAC dac1(A12); + +USBHostMSD msd; +mbed::FATFileSystem usb("usb"); + +FILE *file = nullptr; +int sample_size = 0; +int samples_count = 0; + +int swapFile; + +void setup() { + Serial.begin(115200); + while (!Serial) + ; + + /* Enable power for HOST USB connector. */ + + pinMode(PA_15, OUTPUT); + digitalWrite(PA_15, HIGH); + + Serial.println("Please connect a USB stick to the GIGA's USB port ..."); + while (!msd.connect()) delay(100); + + Serial.println("Mounting USB device ..."); + int const rc_mount = usb.mount(&msd); + if (rc_mount) { + Serial.print("Error mounting USB device "); + Serial.println(rc_mount); + return; + } + configFile(); +} + +void loop() { + if (dac1.available() && !feof(file)) { + /* Read data from file. */ + uint16_t sample_data[256] = { 0 }; + fread(sample_data, sample_size, 256, file); + + /* Get a free buffer for writing. */ + SampleBuffer buf = dac1.dequeue(); + + /* Write data to buffer. */ + for (size_t i = 0; i < buf.size(); i++) { + /* Scale down to 12 bit. */ + uint16_t const dac_val = ((static_cast(sample_data[i]) + 32768) >> 4) & 0x0fff; + buf[i] = dac_val; + } + + /* Write the buffer to DAC. */ + dac1.write(buf); + + if(feof(file)){ + fclose(file); + configFile(); + } + } + + int buttonState = digitalRead(PC_13); + + if (buttonState == 1) { + swapFile = swapFile + 1; + if (swapFile == 4) { + swapFile = 0; + } + delay(500); + configFile(); + } +} + + +void configFile() { + Serial.println("Opening audio file ..."); + + /* 16-bit PCM Mono 16kHz realigned noise reduction */ + if (swapFile == 0) { + file = fopen("/usb/DRUM.wav", "rb"); + } else if (swapFile == 1) { + file = fopen("/usb/WARP.wav", "rb"); + } else if (swapFile == 2) { + file = fopen("/usb/BASS.wav", "rb"); + } else if (swapFile == 3) { + file = fopen("/usb/SHAKE.wav", "rb"); + } + + if (file == nullptr) { + Serial.print("Error opening audio file: "); + Serial.println(strerror(errno)); + return; + } + + Serial.println("Reading audio header ..."); + struct wav_header_t { + char chunkID[4]; //"RIFF" = 0x46464952 + unsigned long chunkSize; //28 [+ sizeof(wExtraFormatBytes) + wExtraFormatBytes] + sum(sizeof(chunk.id) + sizeof(chunk.size) + chunk.size) + char format[4]; //"WAVE" = 0x45564157 + char subchunk1ID[4]; //"fmt " = 0x20746D66 + unsigned long subchunk1Size; //16 [+ sizeof(wExtraFormatBytes) + wExtraFormatBytes] + unsigned short audioFormat; + unsigned short numChannels; + unsigned long sampleRate; + unsigned long byteRate; + unsigned short blockAlign; + unsigned short bitsPerSample; + }; + + wav_header_t header; + fread(&header, sizeof(header), 1, file); + + Serial.println("WAV File Header read:"); + char msg[64] = { 0 }; + snprintf(msg, sizeof(msg), "File Type: %s", header.chunkID); + Serial.println(msg); + snprintf(msg, sizeof(msg), "File Size: %ld", header.chunkSize); + Serial.println(msg); + snprintf(msg, sizeof(msg), "WAV Marker: %s", header.format); + Serial.println(msg); + snprintf(msg, sizeof(msg), "Format Name: %s", header.subchunk1ID); + Serial.println(msg); + snprintf(msg, sizeof(msg), "Format Length: %ld", header.subchunk1Size); + Serial.println(msg); + snprintf(msg, sizeof(msg), "Format Type: %hd", header.audioFormat); + Serial.println(msg); + snprintf(msg, sizeof(msg), "Number of Channels: %hd", header.numChannels); + Serial.println(msg); + snprintf(msg, sizeof(msg), "Sample Rate: %ld", header.sampleRate); + Serial.println(msg); + snprintf(msg, sizeof(msg), "Sample Rate * Bits/Sample * Channels / 8: %ld", header.byteRate); + Serial.println(msg); + snprintf(msg, sizeof(msg), "Bits per Sample * Channels / 8: %hd", header.blockAlign); + Serial.println(msg); + snprintf(msg, sizeof(msg), "Bits per Sample: %hd", header.bitsPerSample); + Serial.println(msg); + + /* Find the data section of the WAV file. */ + struct chunk_t { + char ID[4]; + unsigned long size; + }; + + chunk_t chunk; + snprintf(msg, sizeof(msg), "id\t" + "size"); + Serial.println(msg); + /* Find data chunk. */ + while (true) { + fread(&chunk, sizeof(chunk), 1, file); + snprintf(msg, sizeof(msg), "%c%c%c%c\t" + "%li", + chunk.ID[0], chunk.ID[1], chunk.ID[2], chunk.ID[3], chunk.size); + Serial.println(msg); + if (*(unsigned int *)&chunk.ID == 0x61746164) + break; + /* Skip chunk data bytes. */ + fseek(file, chunk.size, SEEK_CUR); + } + + /* Determine number of samples. */ + sample_size = header.bitsPerSample / 8; + samples_count = chunk.size * 8 / header.bitsPerSample; + snprintf(msg, sizeof(msg), "Sample size = %i", sample_size); + Serial.println(msg); + snprintf(msg, sizeof(msg), "Samples count = %i", samples_count); + Serial.println(msg); + + /* Configure the advanced DAC. */ + if (!dac1.begin(AN_RESOLUTION_12, header.sampleRate, 256, 16)) { + Serial.println("Failed to start DAC1 !"); + return; + } +} +``` + +## Pulse Density Modulation Support + +Pulse Density Support (PDM) is a form of modulation used to represent analog information into digital information; PDM uses a high-frequency stream of 1-bit digital samples. In PDM, a large cluster of ones represents a positive amplitude, while a large cluster of zeros represents a negative amplitude. + +The GIGA R1 PDM support can be used with the [built-in PDM library](https://docs.arduino.cc/learn/built-in-libraries/pdm). Let's check an interesting example that shows of how to read a PDM microphone wwith the GIGA R1: + +```arduino +#include + +// Default number of output channels +static const char channels = 1; + +// Default PCM output frequency +static const int frequency = 16000; + +// Buffer to read samples into, each sample is 16-bits +short sampleBuffer[128]; + +// Number of audio samples read +volatile int samplesRead; + +void setup() { + Serial.begin(9600); + while (!Serial); + + // Configure the callback function and gain + PDM.onReceive(onPDMdata); + PDM.setGain(30); + + // Initialize PDM microphone in mono mode, and a 16 kHz sample rate: + if (!PDM.begin(channels, frequency)) { + Serial.println("Failed to start PDM!"); + while (1); + } +} + +void loop() { + // Wait for samples to be read + if (samplesRead) { + + // Print samples to the Serial Monitor + for (int i = 0; i < samplesRead; i++) { + if(channels == 2) { + Serial.print("L:"); + Serial.print(sampleBuffer[i]); + Serial.print(" R:"); + i++; + } + Serial.println(sampleBuffer[i]); + } + + samplesRead = 0; + } +} + +// Callback function +void onPDMdata() { + int bytesAvailable = PDM.available(); + PDM.read(sampleBuffer, bytesAvailable); + samplesRead = bytesAvailable / 2; +} ``` \ No newline at end of file diff --git a/content/hardware/09.mega/boards/giga-r1-wifi/tutorials/giga-audio/hero-banner.png b/content/hardware/10.mega/boards/giga-r1-wifi/tutorials/giga-audio/hero-banner.png similarity index 100% rename from content/hardware/09.mega/boards/giga-r1-wifi/tutorials/giga-audio/hero-banner.png rename to content/hardware/10.mega/boards/giga-r1-wifi/tutorials/giga-audio/hero-banner.png diff --git a/content/hardware/09.mega/boards/giga-r1-wifi/tutorials/giga-camera/assets/camera-connector-photo.png b/content/hardware/10.mega/boards/giga-r1-wifi/tutorials/giga-camera/assets/camera-connector-photo.png similarity index 100% rename from content/hardware/09.mega/boards/giga-r1-wifi/tutorials/giga-camera/assets/camera-connector-photo.png rename to content/hardware/10.mega/boards/giga-r1-wifi/tutorials/giga-camera/assets/camera-connector-photo.png diff --git a/content/hardware/09.mega/boards/giga-r1-wifi/tutorials/giga-camera/assets/camera-connector-pins.png b/content/hardware/10.mega/boards/giga-r1-wifi/tutorials/giga-camera/assets/camera-connector-pins.png similarity index 100% rename from content/hardware/09.mega/boards/giga-r1-wifi/tutorials/giga-camera/assets/camera-connector-pins.png rename to content/hardware/10.mega/boards/giga-r1-wifi/tutorials/giga-camera/assets/camera-connector-pins.png diff --git a/content/hardware/09.mega/boards/giga-r1-wifi/tutorials/giga-camera/assets/camera-connector-zoomed.png b/content/hardware/10.mega/boards/giga-r1-wifi/tutorials/giga-camera/assets/camera-connector-zoomed.png similarity index 100% rename from content/hardware/09.mega/boards/giga-r1-wifi/tutorials/giga-camera/assets/camera-connector-zoomed.png rename to content/hardware/10.mega/boards/giga-r1-wifi/tutorials/giga-camera/assets/camera-connector-zoomed.png diff --git a/content/hardware/09.mega/boards/giga-r1-wifi/tutorials/giga-camera/assets/camera-schematic.png b/content/hardware/10.mega/boards/giga-r1-wifi/tutorials/giga-camera/assets/camera-schematic.png similarity index 100% rename from content/hardware/09.mega/boards/giga-r1-wifi/tutorials/giga-camera/assets/camera-schematic.png rename to content/hardware/10.mega/boards/giga-r1-wifi/tutorials/giga-camera/assets/camera-schematic.png diff --git a/content/hardware/09.mega/boards/giga-r1-wifi/tutorials/giga-camera/assets/processing-example.png b/content/hardware/10.mega/boards/giga-r1-wifi/tutorials/giga-camera/assets/processing-example.png similarity index 100% rename from content/hardware/09.mega/boards/giga-r1-wifi/tutorials/giga-camera/assets/processing-example.png rename to content/hardware/10.mega/boards/giga-r1-wifi/tutorials/giga-camera/assets/processing-example.png diff --git a/content/hardware/09.mega/boards/giga-r1-wifi/tutorials/giga-camera/giga-camera.md b/content/hardware/10.mega/boards/giga-r1-wifi/tutorials/giga-camera/giga-camera.md similarity index 100% rename from content/hardware/09.mega/boards/giga-r1-wifi/tutorials/giga-camera/giga-camera.md rename to content/hardware/10.mega/boards/giga-r1-wifi/tutorials/giga-camera/giga-camera.md diff --git a/content/hardware/09.mega/boards/giga-r1-wifi/tutorials/giga-camera/hero-banner.png b/content/hardware/10.mega/boards/giga-r1-wifi/tutorials/giga-camera/hero-banner.png similarity index 100% rename from content/hardware/09.mega/boards/giga-r1-wifi/tutorials/giga-camera/hero-banner.png rename to content/hardware/10.mega/boards/giga-r1-wifi/tutorials/giga-camera/hero-banner.png diff --git a/content/hardware/09.mega/boards/giga-r1-wifi/tutorials/giga-dual-core/assets/flash-split.png b/content/hardware/10.mega/boards/giga-r1-wifi/tutorials/giga-dual-core/assets/flash-split.png similarity index 100% rename from content/hardware/09.mega/boards/giga-r1-wifi/tutorials/giga-dual-core/assets/flash-split.png rename to content/hardware/10.mega/boards/giga-r1-wifi/tutorials/giga-dual-core/assets/flash-split.png diff --git a/content/hardware/09.mega/boards/giga-r1-wifi/tutorials/giga-dual-core/assets/target-core.png b/content/hardware/10.mega/boards/giga-r1-wifi/tutorials/giga-dual-core/assets/target-core.png similarity index 100% rename from content/hardware/09.mega/boards/giga-r1-wifi/tutorials/giga-dual-core/assets/target-core.png rename to content/hardware/10.mega/boards/giga-r1-wifi/tutorials/giga-dual-core/assets/target-core.png diff --git a/content/hardware/09.mega/boards/giga-r1-wifi/tutorials/giga-dual-core/giga-dual-core.md b/content/hardware/10.mega/boards/giga-r1-wifi/tutorials/giga-dual-core/giga-dual-core.md similarity index 100% rename from content/hardware/09.mega/boards/giga-r1-wifi/tutorials/giga-dual-core/giga-dual-core.md rename to content/hardware/10.mega/boards/giga-r1-wifi/tutorials/giga-dual-core/giga-dual-core.md diff --git a/content/hardware/09.mega/boards/giga-r1-wifi/tutorials/giga-dual-core/hero-banner.png b/content/hardware/10.mega/boards/giga-r1-wifi/tutorials/giga-dual-core/hero-banner.png similarity index 100% rename from content/hardware/09.mega/boards/giga-r1-wifi/tutorials/giga-dual-core/hero-banner.png rename to content/hardware/10.mega/boards/giga-r1-wifi/tutorials/giga-dual-core/hero-banner.png diff --git a/content/hardware/09.mega/boards/giga-r1-wifi/tutorials/giga-getting-started/assets/giga-connected.png b/content/hardware/10.mega/boards/giga-r1-wifi/tutorials/giga-getting-started/assets/giga-connected.png similarity index 100% rename from content/hardware/09.mega/boards/giga-r1-wifi/tutorials/giga-getting-started/assets/giga-connected.png rename to content/hardware/10.mega/boards/giga-r1-wifi/tutorials/giga-getting-started/assets/giga-connected.png diff --git a/content/hardware/09.mega/boards/giga-r1-wifi/tutorials/giga-getting-started/assets/giga-examples.png b/content/hardware/10.mega/boards/giga-r1-wifi/tutorials/giga-getting-started/assets/giga-examples.png similarity index 100% rename from content/hardware/09.mega/boards/giga-r1-wifi/tutorials/giga-getting-started/assets/giga-examples.png rename to content/hardware/10.mega/boards/giga-r1-wifi/tutorials/giga-getting-started/assets/giga-examples.png diff --git a/content/hardware/09.mega/boards/giga-r1-wifi/tutorials/giga-getting-started/assets/install-giga-core.png b/content/hardware/10.mega/boards/giga-r1-wifi/tutorials/giga-getting-started/assets/install-giga-core.png similarity index 100% rename from content/hardware/09.mega/boards/giga-r1-wifi/tutorials/giga-getting-started/assets/install-giga-core.png rename to content/hardware/10.mega/boards/giga-r1-wifi/tutorials/giga-getting-started/assets/install-giga-core.png diff --git a/content/hardware/09.mega/boards/giga-r1-wifi/tutorials/giga-getting-started/assets/open-ide.png b/content/hardware/10.mega/boards/giga-r1-wifi/tutorials/giga-getting-started/assets/open-ide.png similarity index 100% rename from content/hardware/09.mega/boards/giga-r1-wifi/tutorials/giga-getting-started/assets/open-ide.png rename to content/hardware/10.mega/boards/giga-r1-wifi/tutorials/giga-getting-started/assets/open-ide.png diff --git a/content/hardware/09.mega/boards/giga-r1-wifi/tutorials/giga-getting-started/giga-getting-started.md b/content/hardware/10.mega/boards/giga-r1-wifi/tutorials/giga-getting-started/giga-getting-started.md similarity index 100% rename from content/hardware/09.mega/boards/giga-r1-wifi/tutorials/giga-getting-started/giga-getting-started.md rename to content/hardware/10.mega/boards/giga-r1-wifi/tutorials/giga-getting-started/giga-getting-started.md diff --git a/content/hardware/09.mega/boards/giga-r1-wifi/tutorials/giga-getting-started/hero-banner.png b/content/hardware/10.mega/boards/giga-r1-wifi/tutorials/giga-getting-started/hero-banner.png similarity index 100% rename from content/hardware/09.mega/boards/giga-r1-wifi/tutorials/giga-getting-started/hero-banner.png rename to content/hardware/10.mega/boards/giga-r1-wifi/tutorials/giga-getting-started/hero-banner.png diff --git a/content/hardware/09.mega/boards/giga-r1-wifi/tutorials/giga-micropython/assets/giga-main-boot.png b/content/hardware/10.mega/boards/giga-r1-wifi/tutorials/giga-micropython/assets/giga-main-boot.png similarity index 100% rename from content/hardware/09.mega/boards/giga-r1-wifi/tutorials/giga-micropython/assets/giga-main-boot.png rename to content/hardware/10.mega/boards/giga-r1-wifi/tutorials/giga-micropython/assets/giga-main-boot.png diff --git a/content/hardware/09.mega/boards/giga-r1-wifi/tutorials/giga-micropython/assets/giga-msd.png b/content/hardware/10.mega/boards/giga-r1-wifi/tutorials/giga-micropython/assets/giga-msd.png similarity index 100% rename from content/hardware/09.mega/boards/giga-r1-wifi/tutorials/giga-micropython/assets/giga-msd.png rename to content/hardware/10.mega/boards/giga-r1-wifi/tutorials/giga-micropython/assets/giga-msd.png diff --git a/content/hardware/09.mega/boards/giga-r1-wifi/tutorials/giga-micropython/giga-micropython.md b/content/hardware/10.mega/boards/giga-r1-wifi/tutorials/giga-micropython/giga-micropython.md similarity index 100% rename from content/hardware/09.mega/boards/giga-r1-wifi/tutorials/giga-micropython/giga-micropython.md rename to content/hardware/10.mega/boards/giga-r1-wifi/tutorials/giga-micropython/giga-micropython.md diff --git a/content/hardware/09.mega/boards/giga-r1-wifi/tutorials/giga-micropython/hero-banner.png b/content/hardware/10.mega/boards/giga-r1-wifi/tutorials/giga-micropython/hero-banner.png similarity index 100% rename from content/hardware/09.mega/boards/giga-r1-wifi/tutorials/giga-micropython/hero-banner.png rename to content/hardware/10.mega/boards/giga-r1-wifi/tutorials/giga-micropython/hero-banner.png diff --git a/content/hardware/09.mega/boards/giga-r1-wifi/tutorials/giga-usb/assets/giga-file-write.png b/content/hardware/10.mega/boards/giga-r1-wifi/tutorials/giga-usb/assets/giga-file-write.png similarity index 100% rename from content/hardware/09.mega/boards/giga-r1-wifi/tutorials/giga-usb/assets/giga-file-write.png rename to content/hardware/10.mega/boards/giga-r1-wifi/tutorials/giga-usb/assets/giga-file-write.png diff --git a/content/hardware/09.mega/boards/giga-r1-wifi/tutorials/giga-usb/assets/giga-keyboard-connect.png b/content/hardware/10.mega/boards/giga-r1-wifi/tutorials/giga-usb/assets/giga-keyboard-connect.png similarity index 100% rename from content/hardware/09.mega/boards/giga-r1-wifi/tutorials/giga-usb/assets/giga-keyboard-connect.png rename to content/hardware/10.mega/boards/giga-r1-wifi/tutorials/giga-usb/assets/giga-keyboard-connect.png diff --git a/content/hardware/09.mega/boards/giga-r1-wifi/tutorials/giga-usb/assets/usb-connectors.png b/content/hardware/10.mega/boards/giga-r1-wifi/tutorials/giga-usb/assets/usb-connectors.png similarity index 100% rename from content/hardware/09.mega/boards/giga-r1-wifi/tutorials/giga-usb/assets/usb-connectors.png rename to content/hardware/10.mega/boards/giga-r1-wifi/tutorials/giga-usb/assets/usb-connectors.png diff --git a/content/hardware/09.mega/boards/giga-r1-wifi/tutorials/giga-usb/giga-usb.md b/content/hardware/10.mega/boards/giga-r1-wifi/tutorials/giga-usb/giga-usb.md similarity index 100% rename from content/hardware/09.mega/boards/giga-r1-wifi/tutorials/giga-usb/giga-usb.md rename to content/hardware/10.mega/boards/giga-r1-wifi/tutorials/giga-usb/giga-usb.md diff --git a/content/hardware/09.mega/boards/giga-r1-wifi/tutorials/giga-usb/hero-banner.png b/content/hardware/10.mega/boards/giga-r1-wifi/tutorials/giga-usb/hero-banner.png similarity index 100% rename from content/hardware/09.mega/boards/giga-r1-wifi/tutorials/giga-usb/hero-banner.png rename to content/hardware/10.mega/boards/giga-r1-wifi/tutorials/giga-usb/hero-banner.png diff --git a/content/hardware/09.mega/boards/mega-2560/certifications/Arduino_A000067-DoC_CE.pdf b/content/hardware/10.mega/boards/mega-2560/certifications/Arduino_A000067-DoC_CE.pdf similarity index 100% rename from content/hardware/09.mega/boards/mega-2560/certifications/Arduino_A000067-DoC_CE.pdf rename to content/hardware/10.mega/boards/mega-2560/certifications/Arduino_A000067-DoC_CE.pdf diff --git a/content/hardware/09.mega/boards/mega-2560/certifications/Arduino_A000067-DoC_FCC.pdf b/content/hardware/10.mega/boards/mega-2560/certifications/Arduino_A000067-DoC_FCC.pdf similarity index 100% rename from content/hardware/09.mega/boards/mega-2560/certifications/Arduino_A000067-DoC_FCC.pdf rename to content/hardware/10.mega/boards/mega-2560/certifications/Arduino_A000067-DoC_FCC.pdf diff --git a/content/hardware/09.mega/boards/mega-2560/certifications/Arduino_A000067-DoC_UKCA.pdf b/content/hardware/10.mega/boards/mega-2560/certifications/Arduino_A000067-DoC_UKCA.pdf similarity index 100% rename from content/hardware/09.mega/boards/mega-2560/certifications/Arduino_A000067-DoC_UKCA.pdf rename to content/hardware/10.mega/boards/mega-2560/certifications/Arduino_A000067-DoC_UKCA.pdf diff --git a/content/hardware/09.mega/boards/mega-2560/compatibility.yml b/content/hardware/10.mega/boards/mega-2560/compatibility.yml similarity index 100% rename from content/hardware/09.mega/boards/mega-2560/compatibility.yml rename to content/hardware/10.mega/boards/mega-2560/compatibility.yml diff --git a/content/hardware/09.mega/boards/mega-2560/datasheet/assets/ArduinoFeatureImage.png b/content/hardware/10.mega/boards/mega-2560/datasheet/assets/ArduinoFeatureImage.png similarity index 100% rename from content/hardware/09.mega/boards/mega-2560/datasheet/assets/ArduinoFeatureImage.png rename to content/hardware/10.mega/boards/mega-2560/datasheet/assets/ArduinoFeatureImage.png diff --git a/content/hardware/09.mega/boards/mega-2560/datasheet/assets/ArduinoMEGAMountHoles.png b/content/hardware/10.mega/boards/mega-2560/datasheet/assets/ArduinoMEGAMountHoles.png similarity index 100% rename from content/hardware/09.mega/boards/mega-2560/datasheet/assets/ArduinoMEGAMountHoles.png rename to content/hardware/10.mega/boards/mega-2560/datasheet/assets/ArduinoMEGAMountHoles.png diff --git a/content/hardware/09.mega/boards/mega-2560/datasheet/assets/ArduinoMEGAOutline.png b/content/hardware/10.mega/boards/mega-2560/datasheet/assets/ArduinoMEGAOutline.png similarity index 100% rename from content/hardware/09.mega/boards/mega-2560/datasheet/assets/ArduinoMEGAOutline.png rename to content/hardware/10.mega/boards/mega-2560/datasheet/assets/ArduinoMEGAOutline.png diff --git a/content/hardware/09.mega/boards/mega-2560/datasheet/assets/ArduinoMEGAPinOut.png b/content/hardware/10.mega/boards/mega-2560/datasheet/assets/ArduinoMEGAPinOut.png similarity index 100% rename from content/hardware/09.mega/boards/mega-2560/datasheet/assets/ArduinoMEGAPinOut.png rename to content/hardware/10.mega/boards/mega-2560/datasheet/assets/ArduinoMEGAPinOut.png diff --git a/content/hardware/09.mega/boards/mega-2560/datasheet/assets/ArduinoMEGAPinOut2.png b/content/hardware/10.mega/boards/mega-2560/datasheet/assets/ArduinoMEGAPinOut2.png similarity index 100% rename from content/hardware/09.mega/boards/mega-2560/datasheet/assets/ArduinoMEGAPinOut2.png rename to content/hardware/10.mega/boards/mega-2560/datasheet/assets/ArduinoMEGAPinOut2.png diff --git a/content/hardware/09.mega/boards/mega-2560/datasheet/assets/ArduinoMEGATopView.png b/content/hardware/10.mega/boards/mega-2560/datasheet/assets/ArduinoMEGATopView.png similarity index 100% rename from content/hardware/09.mega/boards/mega-2560/datasheet/assets/ArduinoMEGATopView.png rename to content/hardware/10.mega/boards/mega-2560/datasheet/assets/ArduinoMEGATopView.png diff --git a/content/hardware/09.mega/boards/mega-2560/datasheet/assets/Block_Diagram_Mega2560.png b/content/hardware/10.mega/boards/mega-2560/datasheet/assets/Block_Diagram_Mega2560.png similarity index 100% rename from content/hardware/09.mega/boards/mega-2560/datasheet/assets/Block_Diagram_Mega2560.png rename to content/hardware/10.mega/boards/mega-2560/datasheet/assets/Block_Diagram_Mega2560.png diff --git a/content/hardware/09.mega/boards/mega-2560/datasheet/assets/Power_Tree_Mega_2560_Rev2.svg b/content/hardware/10.mega/boards/mega-2560/datasheet/assets/Power_Tree_Mega_2560_Rev2.svg similarity index 100% rename from content/hardware/09.mega/boards/mega-2560/datasheet/assets/Power_Tree_Mega_2560_Rev2.svg rename to content/hardware/10.mega/boards/mega-2560/datasheet/assets/Power_Tree_Mega_2560_Rev2.svg diff --git a/content/hardware/09.mega/boards/mega-2560/datasheet/datasheet.md b/content/hardware/10.mega/boards/mega-2560/datasheet/datasheet.md similarity index 100% rename from content/hardware/09.mega/boards/mega-2560/datasheet/datasheet.md rename to content/hardware/10.mega/boards/mega-2560/datasheet/datasheet.md diff --git a/content/hardware/09.mega/boards/mega-2560/downloads/A000067-full-pinout.pdf b/content/hardware/10.mega/boards/mega-2560/downloads/A000067-full-pinout.pdf similarity index 100% rename from content/hardware/09.mega/boards/mega-2560/downloads/A000067-full-pinout.pdf rename to content/hardware/10.mega/boards/mega-2560/downloads/A000067-full-pinout.pdf diff --git a/content/hardware/09.mega/boards/mega-2560/downloads/eagle-files.zip b/content/hardware/10.mega/boards/mega-2560/downloads/eagle-files.zip similarity index 100% rename from content/hardware/09.mega/boards/mega-2560/downloads/eagle-files.zip rename to content/hardware/10.mega/boards/mega-2560/downloads/eagle-files.zip diff --git a/content/hardware/09.mega/boards/mega-2560/downloads/fritzing.fzpz b/content/hardware/10.mega/boards/mega-2560/downloads/fritzing.fzpz similarity index 100% rename from content/hardware/09.mega/boards/mega-2560/downloads/fritzing.fzpz rename to content/hardware/10.mega/boards/mega-2560/downloads/fritzing.fzpz diff --git a/content/hardware/09.mega/boards/mega-2560/downloads/schematics.pdf b/content/hardware/10.mega/boards/mega-2560/downloads/schematics.pdf similarity index 100% rename from content/hardware/09.mega/boards/mega-2560/downloads/schematics.pdf rename to content/hardware/10.mega/boards/mega-2560/downloads/schematics.pdf diff --git a/content/hardware/09.mega/boards/mega-2560/essentials.md b/content/hardware/10.mega/boards/mega-2560/essentials.md similarity index 100% rename from content/hardware/09.mega/boards/mega-2560/essentials.md rename to content/hardware/10.mega/boards/mega-2560/essentials.md diff --git a/content/hardware/09.mega/boards/mega-2560/features.md b/content/hardware/10.mega/boards/mega-2560/features.md similarity index 100% rename from content/hardware/09.mega/boards/mega-2560/features.md rename to content/hardware/10.mega/boards/mega-2560/features.md diff --git a/content/hardware/09.mega/boards/mega-2560/image.svg b/content/hardware/10.mega/boards/mega-2560/image.svg similarity index 100% rename from content/hardware/09.mega/boards/mega-2560/image.svg rename to content/hardware/10.mega/boards/mega-2560/image.svg diff --git a/content/hardware/09.mega/boards/mega-2560/interactive/A000067-altium.zip.gpg b/content/hardware/10.mega/boards/mega-2560/interactive/A000067-altium.zip.gpg similarity index 100% rename from content/hardware/09.mega/boards/mega-2560/interactive/A000067-altium.zip.gpg rename to content/hardware/10.mega/boards/mega-2560/interactive/A000067-altium.zip.gpg diff --git a/content/hardware/09.mega/boards/mega-2560/interactive/A000067-pinout.png b/content/hardware/10.mega/boards/mega-2560/interactive/A000067-pinout.png similarity index 100% rename from content/hardware/09.mega/boards/mega-2560/interactive/A000067-pinout.png rename to content/hardware/10.mega/boards/mega-2560/interactive/A000067-pinout.png diff --git a/content/hardware/09.mega/boards/mega-2560/product.md b/content/hardware/10.mega/boards/mega-2560/product.md similarity index 100% rename from content/hardware/09.mega/boards/mega-2560/product.md rename to content/hardware/10.mega/boards/mega-2560/product.md diff --git a/content/hardware/09.mega/boards/mega-2560/suggestions.md b/content/hardware/10.mega/boards/mega-2560/suggestions.md similarity index 100% rename from content/hardware/09.mega/boards/mega-2560/suggestions.md rename to content/hardware/10.mega/boards/mega-2560/suggestions.md diff --git a/content/hardware/09.mega/boards/mega-2560/tech-specs.md b/content/hardware/10.mega/boards/mega-2560/tech-specs.md similarity index 100% rename from content/hardware/09.mega/boards/mega-2560/tech-specs.md rename to content/hardware/10.mega/boards/mega-2560/tech-specs.md diff --git a/content/hardware/09.mega/boards/mega-2560/tech-specs.yml b/content/hardware/10.mega/boards/mega-2560/tech-specs.yml similarity index 100% rename from content/hardware/09.mega/boards/mega-2560/tech-specs.yml rename to content/hardware/10.mega/boards/mega-2560/tech-specs.yml diff --git a/content/hardware/09.mega/family.md b/content/hardware/10.mega/family.md similarity index 96% rename from content/hardware/09.mega/family.md rename to content/hardware/10.mega/family.md index e7e8573870..afe67ea8b1 100644 --- a/content/hardware/09.mega/family.md +++ b/content/hardware/10.mega/family.md @@ -1,4 +1,4 @@ ---- -title: Mega -description: The largest Arduino form factor with a lot of GPIOs. +--- +title: Mega +description: The largest Arduino form factor with a lot of GPIOs. --- \ No newline at end of file diff --git a/content/hardware/09.mega/image-480.png b/content/hardware/10.mega/image-480.png similarity index 100% rename from content/hardware/09.mega/image-480.png rename to content/hardware/10.mega/image-480.png diff --git a/content/hardware/09.mega/image.png b/content/hardware/10.mega/image.png similarity index 100% rename from content/hardware/09.mega/image.png rename to content/hardware/10.mega/image.png From 801a25f662c42d6c140466c448be7adc257985c9 Mon Sep 17 00:00:00 2001 From: TaddyHC Date: Fri, 10 Mar 2023 16:49:49 -0600 Subject: [PATCH 6/8] Spell check fix revolving docs --- .../Genuino101CurieBLEHeartRateMonitor.md | 2 +- .../01.basics/05.digital-analog-pins/digital-analog-pins.md | 2 +- .../control-two-relays-over-the-internet.md | 2 +- .../localize-your-board-with-an-sms.md | 2 +- .../lorawan-farming-with-mkr-wan-1310.md | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) diff --git a/content/library-examples/curie-ble/Genuino101CurieBLEHeartRateMonitor/Genuino101CurieBLEHeartRateMonitor.md b/content/library-examples/curie-ble/Genuino101CurieBLEHeartRateMonitor/Genuino101CurieBLEHeartRateMonitor.md index a73dc9e1ec..fd31a2702a 100644 --- a/content/library-examples/curie-ble/Genuino101CurieBLEHeartRateMonitor/Genuino101CurieBLEHeartRateMonitor.md +++ b/content/library-examples/curie-ble/Genuino101CurieBLEHeartRateMonitor/Genuino101CurieBLEHeartRateMonitor.md @@ -48,7 +48,7 @@ Set up the Arduino software as described in [Getting Started with Arduino 101](h ## Where to Go from Here -The Bluetooth® Low Energy includes [many other services](https://developer.bluetooth.org/gatt/services/Pages/ServicesHome.aspx) with which you can experiment, such as [Alert Notificaion Service](https://developer.bluetooth.org/gatt/services/Pages/ServiceViewer.aspx?u=org.bluetooth.service.alert_notification.xml), [Environmental Sensing](https://developer.bluetooth.org/gatt/services/Pages/ServiceViewer.aspx?u=org.bluetooth.service.environmental_sensing.xml), and [AutomationIO](https://developer.bluetooth.org/gatt/services/Pages/ServiceViewer.aspx?u=org.bluetooth.service.automation_io.xml), in which you can expose all of your Arduino's inputs and control its outputs. +The Bluetooth® Low Energy includes [many other services](https://developer.bluetooth.org/gatt/services/Pages/ServicesHome.aspx) with which you can experiment, such as [Alert Notification Service](https://developer.bluetooth.org/gatt/services/Pages/ServiceViewer.aspx?u=org.bluetooth.service.alert_notification.xml), [Environmental Sensing](https://developer.bluetooth.org/gatt/services/Pages/ServiceViewer.aspx?u=org.bluetooth.service.environmental_sensing.xml), and [AutomationIO](https://developer.bluetooth.org/gatt/services/Pages/ServiceViewer.aspx?u=org.bluetooth.service.automation_io.xml), in which you can expose all of your Arduino's inputs and control its outputs. This tutorial uses nRF Toolbox, which allows the use of 9 services. For more advanced capabilities, other discluded services, as well the CurieImu library's LED examples, we recommend using [LightBlue for iOS](https://itunes.apple.com/it/app/lightblue-explorer-bluetooth/id557428110?mt=8) or [nRF Control Panel for Android](https://play.google.com/store/apps/details?id=no.nordicsemi.android.mcp&hl=it). ## Code diff --git a/content/micropython/01.basics/05.digital-analog-pins/digital-analog-pins.md b/content/micropython/01.basics/05.digital-analog-pins/digital-analog-pins.md index 28a3af518a..5b66e6d653 100644 --- a/content/micropython/01.basics/05.digital-analog-pins/digital-analog-pins.md +++ b/content/micropython/01.basics/05.digital-analog-pins/digital-analog-pins.md @@ -90,7 +90,7 @@ while True: ## Analog Pins -An example of analog pin is the ADC class, that supplies an interface to analog-to-digital convertors, and figures a single endpoint that can sample a continuous voltage and convert it to a discretised value. +An example of analog pin is the ADC class, that supplies an interface to analog-to-digital converters, and figures a single endpoint that can sample a continuous voltage and convert it to a discretised value. There are four methods to use inside the ADC class: `ADC.init`, `ADC.block()`, `ADC.read_16()` and `ADC.read_uv()`. diff --git a/content/tutorials/projects/control-two-relays-over-the-internet/control-two-relays-over-the-internet.md b/content/tutorials/projects/control-two-relays-over-the-internet/control-two-relays-over-the-internet.md index 3db0a0a58d..d47c3bcc6a 100644 --- a/content/tutorials/projects/control-two-relays-over-the-internet/control-two-relays-over-the-internet.md +++ b/content/tutorials/projects/control-two-relays-over-the-internet/control-two-relays-over-the-internet.md @@ -157,7 +157,7 @@ Serial.println("LED on V1: on"); Before you can get everything up and running you should have filled the **arduino_secrets.h** piece of code with the auth token got by email and the credentials to access the internet over GPRS. With this data, the sketch can be uploaded to the MKR GSM 1400. -Launch the Blynk application on your smartphone, then select the project created with the QR code and tap on the "play" icon on the right of the top bar. You should see the icon of a small board with a red blob on it: it is the status of the connection with your board. Load the sketch and wait for the connection process to happen. You may want to monitor it trhough the Serial Monitor. +Launch the Blynk application on your smartphone, then select the project created with the QR code and tap on the "play" icon on the right of the top bar. You should see the icon of a small board with a red blob on it: it is the status of the connection with your board. Load the sketch and wait for the connection process to happen. You may want to monitor it through the Serial Monitor. Anyway, when the board connects to the Blynk server, the red blob should disappear and on the interface you should start to see the virtual LED blinking with a slow pace. You are connected! diff --git a/content/tutorials/projects/localize-your-board-with-an-sms/localize-your-board-with-an-sms.md b/content/tutorials/projects/localize-your-board-with-an-sms/localize-your-board-with-an-sms.md index 863732bde1..0e9123d822 100644 --- a/content/tutorials/projects/localize-your-board-with-an-sms/localize-your-board-with-an-sms.md +++ b/content/tutorials/projects/localize-your-board-with-an-sms/localize-your-board-with-an-sms.md @@ -73,7 +73,7 @@ The `measureLocation()` queries the module to retry the coordinates by cellular //global variable used for location management String GSMlatitude = "0.000000"; String GSMlongitude = "0.000000"; -// This function use the location's APIs to get the device coordinates and update the globa variable if all the requirement are satisfied +// This function use the location's APIs to get the device coordinates and update the global variable if all the requirement are satisfied void measureLocation() { unsigned long timeout = millis(); while (millis() - timeout < 45000) { diff --git a/content/tutorials/projects/lorawan-farming-with-mkr-wan-1310/lorawan-farming-with-mkr-wan-1310.md b/content/tutorials/projects/lorawan-farming-with-mkr-wan-1310/lorawan-farming-with-mkr-wan-1310.md index 1c574082ef..c0ce9cb874 100644 --- a/content/tutorials/projects/lorawan-farming-with-mkr-wan-1310/lorawan-farming-with-mkr-wan-1310.md +++ b/content/tutorials/projects/lorawan-farming-with-mkr-wan-1310/lorawan-farming-with-mkr-wan-1310.md @@ -195,7 +195,7 @@ Connect then in the right order the nodes: you should have now something like th Here you can find this flow ready to be imported in your Node-RED! ```arduino -[{"id":"8ad521ed.ea0c4","type":"ttn uplink","z":"c9ea9bc1.58fd68","name":"Farm Sensor Network","app":"2860f894.1fd7e8","dev_id":"","field":"","x":220,"y":580,"wires":[["36b90326.4d9e8c"]]},{"id":"1ad0e4c9.9f91ab","type":"function","z":"c9ea9bc1.58fd68","name":"Extract LIGHT value","func":"var light = msg.payload.light;\nmsg.payload = light;\nreturn msg;","outputs":1,"noerr":0,"x":880,"y":560,"wires":[["6d2d3359.bd0eec","a6c068f5.820c68"]]},{"id":"6d2d3359.bd0eec","type":"ui_chart","z":"c9ea9bc1.58fd68","name":"Light Chart","group":"a3e71755.838d88","order":14,"width":0,"height":0,"label":"Light","chartType":"line","legend":"false","xformat":"HH:mm:ss","interpolate":"linear","nodata":"","dot":true,"ymin":"0","ymax":"1024","removeOlder":1,"removeOlderPoints":"","removeOlderUnit":"86400","cutout":0,"useOneColor":false,"colors":["#1f77b4","#aec7e8","#ff7f0e","#2ca02c","#98df8a","#d62728","#ff9896","#9467bd","#c5b0d5"],"useOldStyle":false,"x":1200,"y":520,"wires":[[],[]]},{"id":"36b90326.4d9e8c","type":"function","z":"c9ea9bc1.58fd68","name":"Extract Decoded Payload","func":"var value = msg.payload.payload;\nmsg.payload = value;\nmsg.topic = msg.dev_id;\nreturn msg;","outputs":1,"noerr":0,"x":460,"y":620,"wires":[["396b66c6.c58b8a"]]},{"id":"396b66c6.c58b8a","type":"json","z":"c9ea9bc1.58fd68","name":"JSON Parse","property":"payload","action":"","pretty":true,"x":650,"y":560,"wires":[["1ad0e4c9.9f91ab","db3bdfa9.f83f7","c46d41ac.9433","823b2cb9.0a4d8","2d5d8598.029f6a"]]},{"id":"db3bdfa9.f83f7","type":"debug","z":"c9ea9bc1.58fd68","name":"","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"false","x":830,"y":520,"wires":[]},{"id":"c46d41ac.9433","type":"function","z":"c9ea9bc1.58fd68","name":"Extract TEMPERATURE value","func":"var temp = msg.payload.temp;\nmsg.payload = temp;\nreturn msg;","outputs":1,"noerr":0,"x":910,"y":600,"wires":[["5378f82b.09f368","538a8ef5.794a3"]]},{"id":"823b2cb9.0a4d8","type":"function","z":"c9ea9bc1.58fd68","name":"Extract HUMIDITY value","func":"var hum = msg.payload.hum;\nmsg.payload = hum;\nreturn msg;","outputs":1,"noerr":0,"x":890,"y":640,"wires":[["8f2c98bd.4f1c98","4f71ad75.26f1d4"]]},{"id":"5378f82b.09f368","type":"ui_chart","z":"c9ea9bc1.58fd68","name":"Temp Chart","group":"a3e71755.838d88","order":14,"width":0,"height":0,"label":"Temperature","chartType":"line","legend":"false","xformat":"HH:mm:ss","interpolate":"linear","nodata":"","dot":true,"ymin":"-5","ymax":"45","removeOlder":1,"removeOlderPoints":"","removeOlderUnit":"86400","cutout":0,"useOneColor":false,"colors":["#1f77b4","#aec7e8","#ff7f0e","#2ca02c","#98df8a","#d62728","#ff9896","#9467bd","#c5b0d5"],"useOldStyle":false,"x":1200,"y":620,"wires":[[],[]]},{"id":"8f2c98bd.4f1c98","type":"ui_chart","z":"c9ea9bc1.58fd68","name":"Humidity Chart","group":"a3e71755.838d88","order":14,"width":0,"height":0,"label":"Humidity","chartType":"line","legend":"false","xformat":"HH:mm:ss","interpolate":"linear","nodata":"","dot":true,"ymin":"0","ymax":"100","removeOlder":1,"removeOlderPoints":"","removeOlderUnit":"86400","cutout":0,"useOneColor":false,"colors":["#1f77b4","#aec7e8","#ff7f0e","#2ca02c","#98df8a","#d62728","#ff9896","#9467bd","#c5b0d5"],"useOldStyle":false,"x":1210,"y":720,"wires":[[],[]]},{"id":"a6c068f5.820c68","type":"ui_gauge","z":"c9ea9bc1.58fd68","name":"","group":"8389b2aa.13894","order":14,"width":"0","height":"0","gtype":"gage","title":"","label":"","format":"{{value}}","min":0,"max":"1024","colors":["#000000","#757572","#ffffff"],"seg1":"","seg2":"","x":1180,"y":480,"wires":[]},{"id":"538a8ef5.794a3","type":"ui_gauge","z":"c9ea9bc1.58fd68","name":"","group":"8389b2aa.13894","order":15,"width":0,"height":0,"gtype":"gage","title":"","label":"°C","format":"{{value}}","min":"-5","max":"45","colors":["#34a5f2","#09e600","#ca3838"],"seg1":"10","seg2":"28","x":1180,"y":580,"wires":[]},{"id":"4f71ad75.26f1d4","type":"ui_gauge","z":"c9ea9bc1.58fd68","name":"","group":"8389b2aa.13894","order":16,"width":0,"height":0,"gtype":"gage","title":"","label":"%","format":"{{value}}","min":0,"max":"100","colors":["#91edf5","#008fe6","#0005f0"],"seg1":"","seg2":"","x":1180,"y":680,"wires":[]},{"id":"2d5d8598.029f6a","type":"function","z":"c9ea9bc1.58fd68","name":"Extract MOISTURE value","func":"var mois = msg.payload.mois;\nmsg.payload = mois;\nreturn msg;","outputs":1,"noerr":0,"x":900,"y":680,"wires":[["ad89379.1f100c8","307e3855.af1028","4829b01b.8e85e"]]},{"id":"ad89379.1f100c8","type":"ui_gauge","z":"c9ea9bc1.58fd68","name":"","group":"8389b2aa.13894","order":16,"width":0,"height":0,"gtype":"gage","title":"","label":"%","format":"{{value}}","min":0,"max":"1024","colors":["#91edf5","#008fe6","#0005f0"],"seg1":"","seg2":"","x":1190,"y":780,"wires":[]},{"id":"307e3855.af1028","type":"ui_chart","z":"c9ea9bc1.58fd68","name":"Moisture Chart","group":"a3e71755.838d88","order":14,"width":0,"height":0,"label":"Moisture","chartType":"line","legend":"false","xformat":"HH:mm:ss","interpolate":"linear","nodata":"","dot":true,"ymin":"0","ymax":"1024","removeOlder":1,"removeOlderPoints":"","removeOlderUnit":"86400","cutout":0,"useOneColor":false,"colors":["#1f77b4","#aec7e8","#ff7f0e","#2ca02c","#98df8a","#d62728","#ff9896","#9467bd","#c5b0d5"],"useOldStyle":false,"x":1220,"y":820,"wires":[[],[]]},{"id":"4829b01b.8e85e","type":"function","z":"c9ea9bc1.58fd68","name":"Save MOISTURE value","func":"flow.set(\"moisture\", msg.payload);\nreturn msg;","outputs":1,"noerr":0,"x":1250,"y":860,"wires":[[]]},{"id":"2860f894.1fd7e8","type":"ttn app","z":"","appId":"farm_sensor_network","accessKey":"your-access-key","discovery":"discovery.thethingsnetwork.org:1900"},{"id":"a3e71755.838d88","type":"ui_group","z":"","name":"ENVIRONMENTAL SENSOR","tab":"f26ca952.50b6d8","disp":true,"width":"8","collapse":true},{"id":"8389b2aa.13894","type":"ui_group","z":"","name":"SENSOR GAUGE","tab":"f26ca952.50b6d8","disp":true,"width":"7","collapse":true},{"id":"f26ca952.50b6d8","type":"ui_tab","z":"","name":"TTN","icon":"dashboard","disabled":false,"hidden":false}] +[{"id":"8ad521ed.ea0c4","type":"ttn uplink","z":"c9ea9bc1.58fd68","name":"Farm Sensor Network","app":"2860f894.1fd7e8","dev_id":"","field":"","x":220,"y":580,"wires":[["36b90326.4d9e8c"]]},{"id":"1ad0e4c9.9f91ab","type":"function","z":"c9ea9bc1.58fd68","name":"Extract LIGHT value","func":"var light = msg.payload.light;\nmsg.payload = light;\nreturn msg;","outputs":1,"noerr":0,"x":880,"y":560,"wires":[["6d2d3359.bd0eec","a6c068f5.820c68"]]},{"id":"6d2d3359.bd0eec","type":"ui_chart","z":"c9ea9bc1.58fd68","name":"Light Chart","group":"a3e71755.838d88","order":14,"width":0,"height":0,"label":"Light","chartType":"line","legend":"false","xformat":"HH:mm:ss","interpolate":"linear","nodata":"","dot":true,"ymin":"0","ymax":"1024","removeOlder":1,"removeOlderPoints":"","removeOlderUnit":"86400","cutout":0,"useOneColor":false,"colors":["#1f77b4","#aec7e8","#ff7f0e","#2ca02c","#98df8a","#d62728","#ff9896","#9467bd","#c5b0d5"],"useOldStyle":false,"x":1200,"y":520,"wires":[[],[]]},{"id":"36b90326.4d9e8c","type":"function","z":"c9ea9bc1.58fd68","name":"Extract Decoded Payload","func":"var value = msg.payload.payload;\nmsg.payload = value;\nmsg.topic = msg.dev_id;\nreturn msg;","outputs":1,"noerr":0,"x":460,"y":620,"wires":[["396b66c6.c58b8a"]]},{"id":"396b66c6.c58b8a","type":"json","z":"c9ea9bc1.58fd68","name":"JSON Parse","property":"payload","action":"","pretty":true,"x":650,"y":560,"wires":[["1ad0e4c9.9f91ab","db3bdfa9.f83f7","c46d41ac.9433","823b2cb9.0a4d8","2d5d8598.029f6a"]]},{"id":"db3bdfa9.f83f7","type":"debug","z":"c9ea9bc1.58fd68","name":"","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"false","x":830,"y":520,"wires":[]},{"id":"c46d41ac.9433","type":"function","z":"c9ea9bc1.58fd68","name":"Extract TEMPERATURE value","func":"var temp = msg.payload.temp;\nmsg.payload = temp;\nreturn msg;","outputs":1,"noerr":0,"x":910,"y":600,"wires":[["5378f82b.09f368","538a8ef5.794a3"]]},{"id":"823b2cb9.0a4d8","type":"function","z":"c9ea9bc1.58fd68","name":"Extract HUMIDITY value","func":"var hum = msg.payload.hum;\nmsg.payload = hum;\nreturn msg;","outputs":1,"noerr":0,"x":890,"y":640,"wires":[["8f2c98bd.4f1c98","4f71ad75.26f1d4"]]},{"id":"5378f82b.09f368","type":"ui_chart","z":"c9ea9bc1.58fd68","name":"Temp Chart","group":"a3e71755.838d88","order":14,"width":0,"height":0,"label":"Temperature","chartType":"line","legend":"false","xformat":"HH:mm:ss","interpolate":"linear","nodata":"","dot":true,"ymin":"-5","ymax":"45","removeOlder":1,"removeOlderPoints":"","removeOlderUnit":"86400","cutout":0,"useOneColor":false,"colors":["#1f77b4","#aec7e8","#ff7f0e","#2ca02c","#98df8a","#d62728","#ff9896","#9467bd","#c5b0d5"],"useOldStyle":false,"x":1200,"y":620,"wires":[[],[]]},{"id":"8f2c98bd.4f1c98","type":"ui_chart","z":"c9ea9bc1.58fd68","name":"Humidity Chart","group":"a3e71755.838d88","order":14,"width":0,"height":0,"label":"Humidity","chartType":"line","legend":"false","xformat":"HH:mm:ss","interpolate":"linear","nodata":"","dot":true,"ymin":"0","ymax":"100","removeOlder":1,"removeOlderPoints":"","removeOlderUnit":"86400","cutout":0,"useOneColor":false,"colors":["#1f77b4","#aec7e8","#ff7f0e","#2ca02c","#98df8a","#d62728","#ff9896","#9467bd","#c5b0d5"],"useOldStyle":false,"x":1210,"y":720,"wires":[[],[]]},{"id":"a6c068f5.820c68","type":"ui_gauge","z":"c9ea9bc1.58fd68","name":"","group":"8389b2aa.13894","order":14,"width":"0","height":"0","gtype":"gauge","title":"","label":"","format":"{{value}}","min":0,"max":"1024","colors":["#000000","#757572","#ffffff"],"seg1":"","seg2":"","x":1180,"y":480,"wires":[]},{"id":"538a8ef5.794a3","type":"ui_gauge","z":"c9ea9bc1.58fd68","name":"","group":"8389b2aa.13894","order":15,"width":0,"height":0,"gtype":"gauge","title":"","label":"°C","format":"{{value}}","min":"-5","max":"45","colors":["#34a5f2","#09e600","#ca3838"],"seg1":"10","seg2":"28","x":1180,"y":580,"wires":[]},{"id":"4f71ad75.26f1d4","type":"ui_gauge","z":"c9ea9bc1.58fd68","name":"","group":"8389b2aa.13894","order":16,"width":0,"height":0,"gtype":"gauge","title":"","label":"%","format":"{{value}}","min":0,"max":"100","colors":["#91edf5","#008fe6","#0005f0"],"seg1":"","seg2":"","x":1180,"y":680,"wires":[]},{"id":"2d5d8598.029f6a","type":"function","z":"c9ea9bc1.58fd68","name":"Extract MOISTURE value","func":"var mois = msg.payload.mois;\nmsg.payload = mois;\nreturn msg;","outputs":1,"noerr":0,"x":900,"y":680,"wires":[["ad89379.1f100c8","307e3855.af1028","4829b01b.8e85e"]]},{"id":"ad89379.1f100c8","type":"ui_gauge","z":"c9ea9bc1.58fd68","name":"","group":"8389b2aa.13894","order":16,"width":0,"height":0,"gtype":"gauge","title":"","label":"%","format":"{{value}}","min":0,"max":"1024","colors":["#91edf5","#008fe6","#0005f0"],"seg1":"","seg2":"","x":1190,"y":780,"wires":[]},{"id":"307e3855.af1028","type":"ui_chart","z":"c9ea9bc1.58fd68","name":"Moisture Chart","group":"a3e71755.838d88","order":14,"width":0,"height":0,"label":"Moisture","chartType":"line","legend":"false","xformat":"HH:mm:ss","interpolate":"linear","nodata":"","dot":true,"ymin":"0","ymax":"1024","removeOlder":1,"removeOlderPoints":"","removeOlderUnit":"86400","cutout":0,"useOneColor":false,"colors":["#1f77b4","#aec7e8","#ff7f0e","#2ca02c","#98df8a","#d62728","#ff9896","#9467bd","#c5b0d5"],"useOldStyle":false,"x":1220,"y":820,"wires":[[],[]]},{"id":"4829b01b.8e85e","type":"function","z":"c9ea9bc1.58fd68","name":"Save MOISTURE value","func":"flow.set(\"moisture\", msg.payload);\nreturn msg;","outputs":1,"noerr":0,"x":1250,"y":860,"wires":[[]]},{"id":"2860f894.1fd7e8","type":"ttn app","z":"","appId":"farm_sensor_network","accessKey":"your-access-key","discovery":"discovery.thethingsnetwork.org:1900"},{"id":"a3e71755.838d88","type":"ui_group","z":"","name":"ENVIRONMENTAL SENSOR","tab":"f26ca952.50b6d8","disp":true,"width":"8","collapse":true},{"id":"8389b2aa.13894","type":"ui_group","z":"","name":"SENSOR GAUGE","tab":"f26ca952.50b6d8","disp":true,"width":"7","collapse":true},{"id":"f26ca952.50b6d8","type":"ui_tab","z":"","name":"TTN","icon":"dashboard","disabled":false,"hidden":false}] ``` Just select and copy it; then click on the burger icon on the top left corner, and choose *Import* and then *Clipboard* From 130607626d67d090f8987035d80d21c8dee00ce1 Mon Sep 17 00:00:00 2001 From: TaddyHC Date: Mon, 13 Mar 2023 16:41:07 -0600 Subject: [PATCH 7/8] Reverting spell check correction - global content integrity alignment --- .../Genuino101CurieBLEHeartRateMonitor.md | 2 +- .../01.basics/05.digital-analog-pins/digital-analog-pins.md | 2 +- .../control-two-relays-over-the-internet.md | 2 +- .../localize-your-board-with-an-sms.md | 2 +- .../lorawan-farming-with-mkr-wan-1310.md | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) diff --git a/content/library-examples/curie-ble/Genuino101CurieBLEHeartRateMonitor/Genuino101CurieBLEHeartRateMonitor.md b/content/library-examples/curie-ble/Genuino101CurieBLEHeartRateMonitor/Genuino101CurieBLEHeartRateMonitor.md index fd31a2702a..a73dc9e1ec 100644 --- a/content/library-examples/curie-ble/Genuino101CurieBLEHeartRateMonitor/Genuino101CurieBLEHeartRateMonitor.md +++ b/content/library-examples/curie-ble/Genuino101CurieBLEHeartRateMonitor/Genuino101CurieBLEHeartRateMonitor.md @@ -48,7 +48,7 @@ Set up the Arduino software as described in [Getting Started with Arduino 101](h ## Where to Go from Here -The Bluetooth® Low Energy includes [many other services](https://developer.bluetooth.org/gatt/services/Pages/ServicesHome.aspx) with which you can experiment, such as [Alert Notification Service](https://developer.bluetooth.org/gatt/services/Pages/ServiceViewer.aspx?u=org.bluetooth.service.alert_notification.xml), [Environmental Sensing](https://developer.bluetooth.org/gatt/services/Pages/ServiceViewer.aspx?u=org.bluetooth.service.environmental_sensing.xml), and [AutomationIO](https://developer.bluetooth.org/gatt/services/Pages/ServiceViewer.aspx?u=org.bluetooth.service.automation_io.xml), in which you can expose all of your Arduino's inputs and control its outputs. +The Bluetooth® Low Energy includes [many other services](https://developer.bluetooth.org/gatt/services/Pages/ServicesHome.aspx) with which you can experiment, such as [Alert Notificaion Service](https://developer.bluetooth.org/gatt/services/Pages/ServiceViewer.aspx?u=org.bluetooth.service.alert_notification.xml), [Environmental Sensing](https://developer.bluetooth.org/gatt/services/Pages/ServiceViewer.aspx?u=org.bluetooth.service.environmental_sensing.xml), and [AutomationIO](https://developer.bluetooth.org/gatt/services/Pages/ServiceViewer.aspx?u=org.bluetooth.service.automation_io.xml), in which you can expose all of your Arduino's inputs and control its outputs. This tutorial uses nRF Toolbox, which allows the use of 9 services. For more advanced capabilities, other discluded services, as well the CurieImu library's LED examples, we recommend using [LightBlue for iOS](https://itunes.apple.com/it/app/lightblue-explorer-bluetooth/id557428110?mt=8) or [nRF Control Panel for Android](https://play.google.com/store/apps/details?id=no.nordicsemi.android.mcp&hl=it). ## Code diff --git a/content/micropython/01.basics/05.digital-analog-pins/digital-analog-pins.md b/content/micropython/01.basics/05.digital-analog-pins/digital-analog-pins.md index 5b66e6d653..28a3af518a 100644 --- a/content/micropython/01.basics/05.digital-analog-pins/digital-analog-pins.md +++ b/content/micropython/01.basics/05.digital-analog-pins/digital-analog-pins.md @@ -90,7 +90,7 @@ while True: ## Analog Pins -An example of analog pin is the ADC class, that supplies an interface to analog-to-digital converters, and figures a single endpoint that can sample a continuous voltage and convert it to a discretised value. +An example of analog pin is the ADC class, that supplies an interface to analog-to-digital convertors, and figures a single endpoint that can sample a continuous voltage and convert it to a discretised value. There are four methods to use inside the ADC class: `ADC.init`, `ADC.block()`, `ADC.read_16()` and `ADC.read_uv()`. diff --git a/content/tutorials/projects/control-two-relays-over-the-internet/control-two-relays-over-the-internet.md b/content/tutorials/projects/control-two-relays-over-the-internet/control-two-relays-over-the-internet.md index d47c3bcc6a..3db0a0a58d 100644 --- a/content/tutorials/projects/control-two-relays-over-the-internet/control-two-relays-over-the-internet.md +++ b/content/tutorials/projects/control-two-relays-over-the-internet/control-two-relays-over-the-internet.md @@ -157,7 +157,7 @@ Serial.println("LED on V1: on"); Before you can get everything up and running you should have filled the **arduino_secrets.h** piece of code with the auth token got by email and the credentials to access the internet over GPRS. With this data, the sketch can be uploaded to the MKR GSM 1400. -Launch the Blynk application on your smartphone, then select the project created with the QR code and tap on the "play" icon on the right of the top bar. You should see the icon of a small board with a red blob on it: it is the status of the connection with your board. Load the sketch and wait for the connection process to happen. You may want to monitor it through the Serial Monitor. +Launch the Blynk application on your smartphone, then select the project created with the QR code and tap on the "play" icon on the right of the top bar. You should see the icon of a small board with a red blob on it: it is the status of the connection with your board. Load the sketch and wait for the connection process to happen. You may want to monitor it trhough the Serial Monitor. Anyway, when the board connects to the Blynk server, the red blob should disappear and on the interface you should start to see the virtual LED blinking with a slow pace. You are connected! diff --git a/content/tutorials/projects/localize-your-board-with-an-sms/localize-your-board-with-an-sms.md b/content/tutorials/projects/localize-your-board-with-an-sms/localize-your-board-with-an-sms.md index 0e9123d822..863732bde1 100644 --- a/content/tutorials/projects/localize-your-board-with-an-sms/localize-your-board-with-an-sms.md +++ b/content/tutorials/projects/localize-your-board-with-an-sms/localize-your-board-with-an-sms.md @@ -73,7 +73,7 @@ The `measureLocation()` queries the module to retry the coordinates by cellular //global variable used for location management String GSMlatitude = "0.000000"; String GSMlongitude = "0.000000"; -// This function use the location's APIs to get the device coordinates and update the global variable if all the requirement are satisfied +// This function use the location's APIs to get the device coordinates and update the globa variable if all the requirement are satisfied void measureLocation() { unsigned long timeout = millis(); while (millis() - timeout < 45000) { diff --git a/content/tutorials/projects/lorawan-farming-with-mkr-wan-1310/lorawan-farming-with-mkr-wan-1310.md b/content/tutorials/projects/lorawan-farming-with-mkr-wan-1310/lorawan-farming-with-mkr-wan-1310.md index c0ce9cb874..1c574082ef 100644 --- a/content/tutorials/projects/lorawan-farming-with-mkr-wan-1310/lorawan-farming-with-mkr-wan-1310.md +++ b/content/tutorials/projects/lorawan-farming-with-mkr-wan-1310/lorawan-farming-with-mkr-wan-1310.md @@ -195,7 +195,7 @@ Connect then in the right order the nodes: you should have now something like th Here you can find this flow ready to be imported in your Node-RED! ```arduino -[{"id":"8ad521ed.ea0c4","type":"ttn uplink","z":"c9ea9bc1.58fd68","name":"Farm Sensor Network","app":"2860f894.1fd7e8","dev_id":"","field":"","x":220,"y":580,"wires":[["36b90326.4d9e8c"]]},{"id":"1ad0e4c9.9f91ab","type":"function","z":"c9ea9bc1.58fd68","name":"Extract LIGHT value","func":"var light = msg.payload.light;\nmsg.payload = light;\nreturn msg;","outputs":1,"noerr":0,"x":880,"y":560,"wires":[["6d2d3359.bd0eec","a6c068f5.820c68"]]},{"id":"6d2d3359.bd0eec","type":"ui_chart","z":"c9ea9bc1.58fd68","name":"Light Chart","group":"a3e71755.838d88","order":14,"width":0,"height":0,"label":"Light","chartType":"line","legend":"false","xformat":"HH:mm:ss","interpolate":"linear","nodata":"","dot":true,"ymin":"0","ymax":"1024","removeOlder":1,"removeOlderPoints":"","removeOlderUnit":"86400","cutout":0,"useOneColor":false,"colors":["#1f77b4","#aec7e8","#ff7f0e","#2ca02c","#98df8a","#d62728","#ff9896","#9467bd","#c5b0d5"],"useOldStyle":false,"x":1200,"y":520,"wires":[[],[]]},{"id":"36b90326.4d9e8c","type":"function","z":"c9ea9bc1.58fd68","name":"Extract Decoded Payload","func":"var value = msg.payload.payload;\nmsg.payload = value;\nmsg.topic = msg.dev_id;\nreturn msg;","outputs":1,"noerr":0,"x":460,"y":620,"wires":[["396b66c6.c58b8a"]]},{"id":"396b66c6.c58b8a","type":"json","z":"c9ea9bc1.58fd68","name":"JSON Parse","property":"payload","action":"","pretty":true,"x":650,"y":560,"wires":[["1ad0e4c9.9f91ab","db3bdfa9.f83f7","c46d41ac.9433","823b2cb9.0a4d8","2d5d8598.029f6a"]]},{"id":"db3bdfa9.f83f7","type":"debug","z":"c9ea9bc1.58fd68","name":"","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"false","x":830,"y":520,"wires":[]},{"id":"c46d41ac.9433","type":"function","z":"c9ea9bc1.58fd68","name":"Extract TEMPERATURE value","func":"var temp = msg.payload.temp;\nmsg.payload = temp;\nreturn msg;","outputs":1,"noerr":0,"x":910,"y":600,"wires":[["5378f82b.09f368","538a8ef5.794a3"]]},{"id":"823b2cb9.0a4d8","type":"function","z":"c9ea9bc1.58fd68","name":"Extract HUMIDITY value","func":"var hum = msg.payload.hum;\nmsg.payload = hum;\nreturn msg;","outputs":1,"noerr":0,"x":890,"y":640,"wires":[["8f2c98bd.4f1c98","4f71ad75.26f1d4"]]},{"id":"5378f82b.09f368","type":"ui_chart","z":"c9ea9bc1.58fd68","name":"Temp Chart","group":"a3e71755.838d88","order":14,"width":0,"height":0,"label":"Temperature","chartType":"line","legend":"false","xformat":"HH:mm:ss","interpolate":"linear","nodata":"","dot":true,"ymin":"-5","ymax":"45","removeOlder":1,"removeOlderPoints":"","removeOlderUnit":"86400","cutout":0,"useOneColor":false,"colors":["#1f77b4","#aec7e8","#ff7f0e","#2ca02c","#98df8a","#d62728","#ff9896","#9467bd","#c5b0d5"],"useOldStyle":false,"x":1200,"y":620,"wires":[[],[]]},{"id":"8f2c98bd.4f1c98","type":"ui_chart","z":"c9ea9bc1.58fd68","name":"Humidity Chart","group":"a3e71755.838d88","order":14,"width":0,"height":0,"label":"Humidity","chartType":"line","legend":"false","xformat":"HH:mm:ss","interpolate":"linear","nodata":"","dot":true,"ymin":"0","ymax":"100","removeOlder":1,"removeOlderPoints":"","removeOlderUnit":"86400","cutout":0,"useOneColor":false,"colors":["#1f77b4","#aec7e8","#ff7f0e","#2ca02c","#98df8a","#d62728","#ff9896","#9467bd","#c5b0d5"],"useOldStyle":false,"x":1210,"y":720,"wires":[[],[]]},{"id":"a6c068f5.820c68","type":"ui_gauge","z":"c9ea9bc1.58fd68","name":"","group":"8389b2aa.13894","order":14,"width":"0","height":"0","gtype":"gauge","title":"","label":"","format":"{{value}}","min":0,"max":"1024","colors":["#000000","#757572","#ffffff"],"seg1":"","seg2":"","x":1180,"y":480,"wires":[]},{"id":"538a8ef5.794a3","type":"ui_gauge","z":"c9ea9bc1.58fd68","name":"","group":"8389b2aa.13894","order":15,"width":0,"height":0,"gtype":"gauge","title":"","label":"°C","format":"{{value}}","min":"-5","max":"45","colors":["#34a5f2","#09e600","#ca3838"],"seg1":"10","seg2":"28","x":1180,"y":580,"wires":[]},{"id":"4f71ad75.26f1d4","type":"ui_gauge","z":"c9ea9bc1.58fd68","name":"","group":"8389b2aa.13894","order":16,"width":0,"height":0,"gtype":"gauge","title":"","label":"%","format":"{{value}}","min":0,"max":"100","colors":["#91edf5","#008fe6","#0005f0"],"seg1":"","seg2":"","x":1180,"y":680,"wires":[]},{"id":"2d5d8598.029f6a","type":"function","z":"c9ea9bc1.58fd68","name":"Extract MOISTURE value","func":"var mois = msg.payload.mois;\nmsg.payload = mois;\nreturn msg;","outputs":1,"noerr":0,"x":900,"y":680,"wires":[["ad89379.1f100c8","307e3855.af1028","4829b01b.8e85e"]]},{"id":"ad89379.1f100c8","type":"ui_gauge","z":"c9ea9bc1.58fd68","name":"","group":"8389b2aa.13894","order":16,"width":0,"height":0,"gtype":"gauge","title":"","label":"%","format":"{{value}}","min":0,"max":"1024","colors":["#91edf5","#008fe6","#0005f0"],"seg1":"","seg2":"","x":1190,"y":780,"wires":[]},{"id":"307e3855.af1028","type":"ui_chart","z":"c9ea9bc1.58fd68","name":"Moisture Chart","group":"a3e71755.838d88","order":14,"width":0,"height":0,"label":"Moisture","chartType":"line","legend":"false","xformat":"HH:mm:ss","interpolate":"linear","nodata":"","dot":true,"ymin":"0","ymax":"1024","removeOlder":1,"removeOlderPoints":"","removeOlderUnit":"86400","cutout":0,"useOneColor":false,"colors":["#1f77b4","#aec7e8","#ff7f0e","#2ca02c","#98df8a","#d62728","#ff9896","#9467bd","#c5b0d5"],"useOldStyle":false,"x":1220,"y":820,"wires":[[],[]]},{"id":"4829b01b.8e85e","type":"function","z":"c9ea9bc1.58fd68","name":"Save MOISTURE value","func":"flow.set(\"moisture\", msg.payload);\nreturn msg;","outputs":1,"noerr":0,"x":1250,"y":860,"wires":[[]]},{"id":"2860f894.1fd7e8","type":"ttn app","z":"","appId":"farm_sensor_network","accessKey":"your-access-key","discovery":"discovery.thethingsnetwork.org:1900"},{"id":"a3e71755.838d88","type":"ui_group","z":"","name":"ENVIRONMENTAL SENSOR","tab":"f26ca952.50b6d8","disp":true,"width":"8","collapse":true},{"id":"8389b2aa.13894","type":"ui_group","z":"","name":"SENSOR GAUGE","tab":"f26ca952.50b6d8","disp":true,"width":"7","collapse":true},{"id":"f26ca952.50b6d8","type":"ui_tab","z":"","name":"TTN","icon":"dashboard","disabled":false,"hidden":false}] +[{"id":"8ad521ed.ea0c4","type":"ttn uplink","z":"c9ea9bc1.58fd68","name":"Farm Sensor Network","app":"2860f894.1fd7e8","dev_id":"","field":"","x":220,"y":580,"wires":[["36b90326.4d9e8c"]]},{"id":"1ad0e4c9.9f91ab","type":"function","z":"c9ea9bc1.58fd68","name":"Extract LIGHT value","func":"var light = msg.payload.light;\nmsg.payload = light;\nreturn msg;","outputs":1,"noerr":0,"x":880,"y":560,"wires":[["6d2d3359.bd0eec","a6c068f5.820c68"]]},{"id":"6d2d3359.bd0eec","type":"ui_chart","z":"c9ea9bc1.58fd68","name":"Light Chart","group":"a3e71755.838d88","order":14,"width":0,"height":0,"label":"Light","chartType":"line","legend":"false","xformat":"HH:mm:ss","interpolate":"linear","nodata":"","dot":true,"ymin":"0","ymax":"1024","removeOlder":1,"removeOlderPoints":"","removeOlderUnit":"86400","cutout":0,"useOneColor":false,"colors":["#1f77b4","#aec7e8","#ff7f0e","#2ca02c","#98df8a","#d62728","#ff9896","#9467bd","#c5b0d5"],"useOldStyle":false,"x":1200,"y":520,"wires":[[],[]]},{"id":"36b90326.4d9e8c","type":"function","z":"c9ea9bc1.58fd68","name":"Extract Decoded Payload","func":"var value = msg.payload.payload;\nmsg.payload = value;\nmsg.topic = msg.dev_id;\nreturn msg;","outputs":1,"noerr":0,"x":460,"y":620,"wires":[["396b66c6.c58b8a"]]},{"id":"396b66c6.c58b8a","type":"json","z":"c9ea9bc1.58fd68","name":"JSON Parse","property":"payload","action":"","pretty":true,"x":650,"y":560,"wires":[["1ad0e4c9.9f91ab","db3bdfa9.f83f7","c46d41ac.9433","823b2cb9.0a4d8","2d5d8598.029f6a"]]},{"id":"db3bdfa9.f83f7","type":"debug","z":"c9ea9bc1.58fd68","name":"","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"false","x":830,"y":520,"wires":[]},{"id":"c46d41ac.9433","type":"function","z":"c9ea9bc1.58fd68","name":"Extract TEMPERATURE value","func":"var temp = msg.payload.temp;\nmsg.payload = temp;\nreturn msg;","outputs":1,"noerr":0,"x":910,"y":600,"wires":[["5378f82b.09f368","538a8ef5.794a3"]]},{"id":"823b2cb9.0a4d8","type":"function","z":"c9ea9bc1.58fd68","name":"Extract HUMIDITY value","func":"var hum = msg.payload.hum;\nmsg.payload = hum;\nreturn msg;","outputs":1,"noerr":0,"x":890,"y":640,"wires":[["8f2c98bd.4f1c98","4f71ad75.26f1d4"]]},{"id":"5378f82b.09f368","type":"ui_chart","z":"c9ea9bc1.58fd68","name":"Temp Chart","group":"a3e71755.838d88","order":14,"width":0,"height":0,"label":"Temperature","chartType":"line","legend":"false","xformat":"HH:mm:ss","interpolate":"linear","nodata":"","dot":true,"ymin":"-5","ymax":"45","removeOlder":1,"removeOlderPoints":"","removeOlderUnit":"86400","cutout":0,"useOneColor":false,"colors":["#1f77b4","#aec7e8","#ff7f0e","#2ca02c","#98df8a","#d62728","#ff9896","#9467bd","#c5b0d5"],"useOldStyle":false,"x":1200,"y":620,"wires":[[],[]]},{"id":"8f2c98bd.4f1c98","type":"ui_chart","z":"c9ea9bc1.58fd68","name":"Humidity Chart","group":"a3e71755.838d88","order":14,"width":0,"height":0,"label":"Humidity","chartType":"line","legend":"false","xformat":"HH:mm:ss","interpolate":"linear","nodata":"","dot":true,"ymin":"0","ymax":"100","removeOlder":1,"removeOlderPoints":"","removeOlderUnit":"86400","cutout":0,"useOneColor":false,"colors":["#1f77b4","#aec7e8","#ff7f0e","#2ca02c","#98df8a","#d62728","#ff9896","#9467bd","#c5b0d5"],"useOldStyle":false,"x":1210,"y":720,"wires":[[],[]]},{"id":"a6c068f5.820c68","type":"ui_gauge","z":"c9ea9bc1.58fd68","name":"","group":"8389b2aa.13894","order":14,"width":"0","height":"0","gtype":"gage","title":"","label":"","format":"{{value}}","min":0,"max":"1024","colors":["#000000","#757572","#ffffff"],"seg1":"","seg2":"","x":1180,"y":480,"wires":[]},{"id":"538a8ef5.794a3","type":"ui_gauge","z":"c9ea9bc1.58fd68","name":"","group":"8389b2aa.13894","order":15,"width":0,"height":0,"gtype":"gage","title":"","label":"°C","format":"{{value}}","min":"-5","max":"45","colors":["#34a5f2","#09e600","#ca3838"],"seg1":"10","seg2":"28","x":1180,"y":580,"wires":[]},{"id":"4f71ad75.26f1d4","type":"ui_gauge","z":"c9ea9bc1.58fd68","name":"","group":"8389b2aa.13894","order":16,"width":0,"height":0,"gtype":"gage","title":"","label":"%","format":"{{value}}","min":0,"max":"100","colors":["#91edf5","#008fe6","#0005f0"],"seg1":"","seg2":"","x":1180,"y":680,"wires":[]},{"id":"2d5d8598.029f6a","type":"function","z":"c9ea9bc1.58fd68","name":"Extract MOISTURE value","func":"var mois = msg.payload.mois;\nmsg.payload = mois;\nreturn msg;","outputs":1,"noerr":0,"x":900,"y":680,"wires":[["ad89379.1f100c8","307e3855.af1028","4829b01b.8e85e"]]},{"id":"ad89379.1f100c8","type":"ui_gauge","z":"c9ea9bc1.58fd68","name":"","group":"8389b2aa.13894","order":16,"width":0,"height":0,"gtype":"gage","title":"","label":"%","format":"{{value}}","min":0,"max":"1024","colors":["#91edf5","#008fe6","#0005f0"],"seg1":"","seg2":"","x":1190,"y":780,"wires":[]},{"id":"307e3855.af1028","type":"ui_chart","z":"c9ea9bc1.58fd68","name":"Moisture Chart","group":"a3e71755.838d88","order":14,"width":0,"height":0,"label":"Moisture","chartType":"line","legend":"false","xformat":"HH:mm:ss","interpolate":"linear","nodata":"","dot":true,"ymin":"0","ymax":"1024","removeOlder":1,"removeOlderPoints":"","removeOlderUnit":"86400","cutout":0,"useOneColor":false,"colors":["#1f77b4","#aec7e8","#ff7f0e","#2ca02c","#98df8a","#d62728","#ff9896","#9467bd","#c5b0d5"],"useOldStyle":false,"x":1220,"y":820,"wires":[[],[]]},{"id":"4829b01b.8e85e","type":"function","z":"c9ea9bc1.58fd68","name":"Save MOISTURE value","func":"flow.set(\"moisture\", msg.payload);\nreturn msg;","outputs":1,"noerr":0,"x":1250,"y":860,"wires":[[]]},{"id":"2860f894.1fd7e8","type":"ttn app","z":"","appId":"farm_sensor_network","accessKey":"your-access-key","discovery":"discovery.thethingsnetwork.org:1900"},{"id":"a3e71755.838d88","type":"ui_group","z":"","name":"ENVIRONMENTAL SENSOR","tab":"f26ca952.50b6d8","disp":true,"width":"8","collapse":true},{"id":"8389b2aa.13894","type":"ui_group","z":"","name":"SENSOR GAUGE","tab":"f26ca952.50b6d8","disp":true,"width":"7","collapse":true},{"id":"f26ca952.50b6d8","type":"ui_tab","z":"","name":"TTN","icon":"dashboard","disabled":false,"hidden":false}] ``` Just select and copy it; then click on the burger icon on the top left corner, and choose *Import* and then *Clipboard* From c80edc3aae2b292908b93301340c04bac3c3b294 Mon Sep 17 00:00:00 2001 From: TaddyHC Date: Tue, 14 Mar 2023 15:52:03 -0600 Subject: [PATCH 8/8] Content minor update (Trigger Checks) --- content/hardware/07.opta/opta-family/opta/features.md | 1 + 1 file changed, 1 insertion(+) diff --git a/content/hardware/07.opta/opta-family/opta/features.md b/content/hardware/07.opta/opta-family/opta/features.md index a0d7430118..60992d7ec4 100644 --- a/content/hardware/07.opta/opta-family/opta/features.md +++ b/content/hardware/07.opta/opta-family/opta/features.md @@ -7,6 +7,7 @@ It allows professionals to scale up automation projects while taking advantage o Quickly put it to work, leveraging the many available software libraries. The onboard secure element ensures Over-The-Air firmware updates and remote control via the Arduino Cloud or third-party services. Arduino Opta® is available in three variants: + * Arduino Opta® Lite: on-board Ethernet and USB-C® ports * Arduino Opta® RS485: on-board Ethernet and USB-C® ports, plus RS-485 connectivity * Arduino Opta® WiFi: on-board Ethernet and USB-C® ports, plus RS-485 and Wi-Fi®/Bluetooth® Low Energy