SIMATIC IOT2020: Yocto Linux, Arduino Shield Integration, and Industrial IoT Gateway Reference
The SIMATIC IOT2020 is an open, Arduino-compatible industrial IoT gateway released by Siemens as part of its Siemens Automation Cooperates with Education (SCE) training initiative. The platform targets universities, vocational colleges, and engineering teams who need to prototype sensor-to-cloud applications on a Linux-based edge node before promoting logic into a real SIMATIC S7 controller. This technical reference consolidates verified hardware specifications, the official Yocto image workflow, Arduino sketch deployment, MQTT/OPC UA publishing, and the operational limits that distinguish the IOT2020 from a true SIMATIC distributed I/O station such as the ET 200S.
1. Product Positioning and Intended Use
The IOT2020 was positioned by Siemens as an entry-level node in its industrial IoT ecosystem. Typical use cases:
- Universities and technical schools in the SCE global training network, where students explore Linux, Arduino, and cloud telemetry side-by-side with PLC theory.
- Engineering teams prototyping sensor pre-processing, edge analytics, and cloud telemetry on a deterministic Linux stack.
- Maker-style integrators who require native Arduino sketch execution plus Linux tools (MQTT, OPC UA, Python) without PLC programming overhead.
It is explicitly not a replacement for a SIMATIC S7-1200/S7-1500 controller or an ET 200 distributed I/O head module. Its role is data concentration, protocol translation, and edge analytics in front of — not in place of — a deterministic automation controller.
2. Verified Hardware Specifications
The following table consolidates the specifications published in the official SIMATIC IOT2020 datasheet from the Siemens SCE portal. Always cross-check current revisions against the manufacturer document before ordering or designing around the device.
| Parameter | Specification |
|---|---|
| Processor | Intel Quark SoC X1000, x86, 32-bit, 400 MHz, single core, Pentium ISA compatible |
| System memory | 256 MB DDR3 RAM, soldered onboard, not user-expandable |
| Non-volatile memory | 8 MB SPI flash for bootloader/firmware + microSD card slot for OS and application data |
| Ethernet | 1 × 10/100 Mbit/s RJ45 |
| USB | 1 × USB 2.0 device (Type B, programming), 1 × USB 2.0 host (Type A, peripherals) |
| Expansion | 1 × mini-PCIe (half-size) supporting USB 2.0 + PCIe x1 lanes (cellular modem, Wi-Fi, additional Ethernet) |
| Arduino shield headers | Arduino Uno R3-compatible layout (6 × analog in, 14 × digital I/O, PWM, I2C, SPI, UART) |
| Power supply | 7–15 V DC, 2.1 mm barrel jack, typical 12 V / 1 A; USB cannot supply enough current for shields |
| Operating temperature | 0 °C to +40 °C, non-condensing |
| Storage temperature | −20 °C to +70 °C |
| Dimensions (L × W × H) | approximately 101.6 mm × 72.0 mm × 18.0 mm, matches Arduino Uno footprint |
| Operating system | Yocto-based Linux (Siemens-supplied SD card image) |
| MTBF / certifications | CE, FCC, IC, RCM; no UL listing, no IEC 61131-2 conformance |
The absence of IEC 61131-2 certification is the critical limitation: the board cannot legally be marketed or installed as an industrial PLC or distributed I/O head in production machinery in many regions.
3. Architecture: Intel Quark X1000 vs. Raspberry Pi
The IOT2020 shares the same physical footprint as an Arduino Uno, not a Raspberry Pi. Confusion arises because both expose a multi-pin header and boot from microSD, but the internals differ materially:
| Feature | SIMATIC IOT2020 | Raspberry Pi 3 Model B (typical reference) |
|---|---|---|
| SoC | Intel Quark X1000 (x86) | Broadcom BCM2837 (ARM Cortex-A53) |
| Clock | 400 MHz, single core | 1.2 GHz, four cores |
| RAM | 256 MB DDR3 | 1 GB LPDDR2 |
| Instruction set | x86 (Pentium compatible) | ARMv8-A (AArch64) |
| Shield stack | Arduino Uno R3 headers + Arduino sketch IDE on board | 40-pin GPIO header only (no Arduino shield pinout) |
| OS image | Yocto Linux (custom Siemens build) | Raspbian / Debian ARMHF |
| Native Arduino execution | Yes (Quark Galileo profile) | No (would require emulation or stack) |
Choosing between them is not a performance comparison — the IOT2020 is markedly slower than a Raspberry Pi 3 — but a tooling decision. If your application uses Arduino libraries and shields, the IOT2020 can compile and run them natively via the on-board Arduino IDE. A Raspberry Pi must emulate Arduino via software tools or use a dedicated Arduino coprocessor.
4. Arduino-Compatible I/O Pinout
The 36-pin Arduino shield headers (D0–D13, A0–A5, +5 V, +3.3 V, GND, VIN) map directly to the Quark SoC GPIO. Pin functions follow the standard Arduino Uno convention. Standard Arduino libraries (Wire, SPI, Servo, etc.) are usable without modification because the Intel Galileo profile mirrors the AVR register model.
| Pin group | Arduino name | Function | Notes |
|---|---|---|---|
| Digital | D0–D13 | GPIO, some with PWM | Logic level 3.3 V on the Quark silicon; shield level translation required for 5 V outputs |
| Analog input | A0–A5 | 10-bit ADC, 0–5 V range | 1024-step resolution; suitable for thermistor, potentiometer, 4–20 mA via 250 Ω shunt |
| PWM | D3, D5, D6, D9, D10, D11 | 8-bit PWM | Default frequency 490 Hz; D5 and D6 default to ~980 Hz |
| I2C | A4 (SDA), A5 (SCL) | I2C bus | 3.3 V logic, external pull-ups recommended |
| SPI | D10 (SS), D11 (MOSI), D12 (MISO), D13 (SCK) | SPI bus (hardware) | Accessible from Linux as /dev/spidev when not held by an Arduino sketch |
| UART | D0 (RX), D1 (TX) | Serial console, also routed to USB | Linux console on /dev/ttyGS0 (USB) and /dev/ttyS0 (pins) |
| Power | VIN, 5 V, 3.3 V, GND | Input/output rails | 5 V rail from onboard switching regulator; 3.3 V from Quark LDO; max draw per pin ~10 mA |
5. Yocto Linux Image Installation
The IOT2020 does not have a writable on-board flash large enough for a root file system. All runtime code lives on a microSD card, which holds the Siemens-supplied Yocto image.
5.1 Prerequisites
- Industrial-grade microSD card, ≥ 4 GB, class 10 or higher; SLC or A1-rated cards recommended for environments with vibration or temperature stress
- Signed image file (typically
.wic) downloaded from the official Siemens SCE portal - Card reader and flashing tool: balenaEtcher, Win32 Disk Imager, or
ddon Linux/macOS - USB Type B cable for serial console access (115200 8N1) in case Ethernet provisioning fails
5.2 Flashing procedure
- Download the latest signed image from the Siemens SCE SIMATIC IOT2020 page. Verify the SHA-256 checksum against the value published in the release notes before flashing.
- Insert the microSD card into the host PC. Confirm the device path with
lsblkon Linux or Disk Utility on macOS. Confirm the target device letter on Windows. - Flash the image with
dd(Linux example):
On Windows, use Win32 Disk Imager or balenaEtcher and select thesudo dd if=iot2020-image.wic of=/dev/sdX bs=4M status=progress conv=fdatasync sync.wicdirectly. balenaEtcher accepts raw images and verifies the write automatically. - Eject the card, insert it into the IOT2020, and apply 12 V DC. The board boots in approximately 25–35 seconds. Successful boot is indicated by a green heartbeat pattern on the user LED and an active link LED on the Ethernet RJ45.
- Determine the assigned IP address from your DHCP server lease table, or attach via the serial console on USB Type B at 115200 8N1 if no DHCP server is reachable.
- SSH into the device:
ssh root@<ip-address>. The default credentials are documented in the SCE release notes; change the root password on first login withpasswd.
5.3 Image customization with Yocto
To build a custom image, set up a Yocto workspace with the Siemens-supplied BSP layer. The IOT2020 BSP is built against the Poky Krogoth release branch:
git clone -b krogoth git://git.yoctoproject.org/poky.git
git clone -b krogoth https://github.com/siemens/meta-iot2020.git
cd poky
source oe-init-build-env build
bitbake-layers add-layer ../meta-iot2020
echo 'MACHINE = "iot2020"' >> conf/local.conf
bitbake iot2020-image
The build output appears in tmp/deploy/images/iot2020/ as a .wic file ready for direct flashing to an SD card. To add your own application, write a Yocto recipe under meta-yourcompany/recipes-apps/ and append it to the image's IMAGE_INSTALL list in local.conf.
6. Network Configuration and Communication Protocols
The IOT2020 reference image uses systemd-networkd. To assign a static IP, edit /etc/systemd/network/wired.network:
[Match]
Name=eth0
[Network]
Address=192.168.0.50/24
Gateway=192.168.0.1
DNS=192.168.0.1
Apply with systemctl restart systemd-networkd. Verify with ip addr show eth0 and ip route.
6.1 MQTT client (Eclipse Paho C)
The reference image bundles Mosquitto client tools and the Eclipse Paho C library. A minimal publisher in C:
#include <stdio.h>
#include <string.h>
#include "MQTTClient.h"
int main() {
MQTTClient client;
MQTTClient_create(&client, "tcp://broker.hivemq.com:1883",
"iot2020_pub", MQTTCLIENT_PERSISTENCE_NONE, NULL);
MQTTClient_connectOptions opts = MQTTClient_connectOptions_initializer;
opts.keepAliveInterval = 20;
opts.cleansession = 1;
MQTTClient_connect(client, &opts);
MQTTClient_message pubmsg = MQTTClient_message_initializer;
pubmsg.payload = "{\"temp\":23.4}";
pubmsg.payloadlen = strlen(pubmsg.payload);
pubmsg.qos = 1;
pubmsg.retained = 0;
MQTTClient_publishMessage(client, "siemens/iot2020/sensors", &pubmsg, NULL);
MQTTClient_disconnect(client, 10000);
MQTTClient_destroy(&client);
return 0;
}
Compile against the Paho libraries in the Yocto SDK. Subscribe from any host with mosquitto_sub -h broker.hivemq.com -t "siemens/iot2020/#" -v.
6.2 OPC UA server (open62541)
For integration with SIMATIC controllers and SCADA systems, deploy an OPC UA server using the open62541 stack. Bind the server to 0.0.0.0:4840 and expose the analog input values as OPC UA variables. A SIMATIC S7-1500 (firmware ≥ V2.0) can subscribe as an OPC UA client and route data into the PLC program via the OPC_UA_Client instruction.
6.3 Modbus TCP gateway
The IOT2020 commonly acts as a Modbus TCP-to-MQTT bridge using libmodbus. Typical ports exposed by the reference image:
- Modbus TCP: 502
- MQTT: 1883 (plain) / 8883 (TLS)
- OPC UA: 4840
- SSH: 22; HTTP diagnostic UI: 80
Open firewall ports on the host side with firewall-cmd --permanent --add-port=502/tcp (or equivalent iptables rules) before commissioning.
7. Integration with SIMATIC Automation Systems
The IOT2020 is not a PROFINET device and cannot replace an ET 200 distributed I/O head. It connects to a SIMATIC PLC through:
- S7 communication via Snap7 library over ISO-on-TCP (port 102). The IOT2020 reads/writes data blocks from an S7-1200 or S7-1500 controller.
- OPC UA from S7-1500 (firmware ≥ V2.0) consuming variables exposed by the IOT2020.
- MQTT broker on the plant network, with the PLC subscribing via custom function blocks or uploading to MindSphere / Insights Hub via the MindConnect IoT extension.
A common architecture places the IOT2020 as a sensor concentrator at the field level, with aggregated data flowing to a higher-level system for analytics. The deterministic control loop stays inside the S7 controller; the IOT2020 handles non-critical telemetry only.
8. Comparison: SIMATIC IOT2020 vs. SIMATIC ET 200S
| Criterion | SIMATIC IOT2020 | SIMATIC ET 200S |
|---|---|---|
| Function | IoT gateway / edge node | Distributed I/O on PROFINET / PROFIBUS |
| Determinism | Non-deterministic (Linux, ~10–25 ms jitter typical) | Deterministic (≤ 1 ms cycle time on PROFINET IRT) |
| Fieldbus | None natively; Modbus TCP, MQTT, OPC UA over Ethernet | PROFINET IO and PROFIBUS DP |
| Logic execution | Linux application, Python, C/C++, or Arduino sketch | None — pure I/O, head module routes to PLC |
| Operating temperature | 0–40 °C | 0–60 °C, optional −25 °C variants |
| IEC 61131-2 conformance | No | Yes |
| Programming | Yocto C/C++, Python, Arduino IDE, MQTT brokers | TIA Portal HW config + GSD file import |
| Typical role | Telemetry, prototyping, training, edge analytics | Field I/O expansion with deterministic response |
| Discontinued | Yes (succeeded by IOT2050) | Yes (succeeded by ET 200SP) |
Rule of thumb: use the ET 200S when wiring a sensor directly into the SIMATIC automation cell and cycle time matters. Use the IOT2020 when extracting data to a higher-level system (cloud, dashboard, MQTT broker) and real-time guarantees are not required. For new designs, both should be replaced by their current successors — the IOT2050 family and the ET 200SP.
9. Troubleshooting Matrix
| Symptom | Likely cause | Corrective action |
|---|---|---|
| No heartbeat LED after power-on | Insufficient power, reversed polarity, or corrupt SD card | Verify 12 V DC at barrel jack with multimeter; re-flash SD card from signed image; try a known-good card |
| Boots but Ethernet port is dead | Driver not loaded, cable miswired, or switch port disabled |
ip link show confirms interface up? modprobe e1000e; swap patch cable; test on a different switch port |
| SSH login fails, password rejected | Default password changed in a different image revision; keyboard layout issue during set-up | Re-flash SD card to factory state, or boot recovery image over UART console |
| Analog input reads constant 1023 | Open circuit / floating input | Add a pull-down resistor (10 kΩ) to GND; verify sensor excitation and reference |
| Arduino sketch upload fails from IDE | Board package missing in Arduino IDE | Add Intel i586 Boards via Board Manager URL; select Intel Galileo Gen 2 as target |
| OPC UA client cannot connect | Server bound to localhost only, or firewall blocking 4840 | Edit /etc/opcua/server.conf; bind to 0.0.0.0; reload systemd unit; open firewall |
| MQTT publishes drop with QoS > 0 retries | Unstable broker connection, keepalive too low, or DNS failure | Raise keepAliveInterval to ≥ 30 s; verify Wi-Fi/Ethernet signal; set static DNS |
| System clock drifts after reboot | No RTC backup battery on board | Enable NTP via systemd-timesyncd: timedatectl set-ntp true; verify with timedatectl status
|
| Board resets under Arduino shield load | Insufficient current from USB-only supply | Always power the IOT2020 from a 12 V external supply when shields are attached; USB alone is for programming only |
Yocto bitbake fails with GCC errors |
Host glibc version mismatch | Use a clean Ubuntu 16.04 / 18.04 build host or a Yocto-compatible container; refer to the Yocto Project documentation for supported host distros |
10. Industrial Suitability and Successor: SIMATIC IOT2050
The IOT2020 is intentionally a training platform. Its 0–40 °C operating temperature, lack of IEC 61131-2 conformance, and absence of PROFINET certification disqualify it from many production cabinets. For industrial environments, Siemens released the IOT2050 family:
| Model | CPU | RAM | Operating temperature | Notes |
|---|---|---|---|---|
| IOT2050 Basic | TI Sitara AM6528 (ARM Cortex-A53, dual core) | 1 GB DDR4 | 0–50 °C | Successor entry-level node for industrial-grade sensor pre-processing |
| IOT2050 Advanced | TI Sitara AM6548 (ARM Cortex-A53, quad core) | 2 GB DDR4 | 0–50 °C | Includes PROFINET device interface for direct PLC connectivity |
Migration from IOT2020 to IOT2050 reuses the same Yocto workflow: the BSP layer meta-iot2050 replaces meta-iot2020. Custom application recipes transfer with minimal change because both platforms use systemd, Python 3, and standard Linux networking.
For higher-level industrial automation contexts — robotic cells, palletizing, machine tending, large-scale line integration — gateways like the IOT2050 typically feed data into SIMATIC PLCs and SCADA rather than driving motion directly. Robotic integration work runs through dedicated vendors with hardened controllers and certified safety chains. Broader industrial automation strategy and use-case framing is documented across the industry; see, for example, the KUKA industrial automation overview for a robotics-centric perspective.
11. Field-Commissioning Checklist
- Verify power supply: regulated 12 V DC ± 5 %, 1 A minimum. Confirm polarity before applying power.
- Insert flashed microSD before power-up. Cold-boot only — hot-plugging the SD card is not supported.
- Capture the DHCP lease or assign a static IP via
systemd-networkdand document the address on the asset register. - Update the root password on first login. Disable password SSH if key-based authentication is used in production.
- Configure NTP and verify with
timedatectl status.System clock synchronized: yesis required for log correlation. - Validate analog inputs with a calibrated 4–20 mA source through a 250 Ω shunt; confirm 4 mA maps to ~1.0 V and 20 mA to ~5.0 V (use averaging if noise is present).
- Smoke-test MQTT or OPC UA publishing against the broker or SCADA; verify QoS 1 acknowledgements if used.
- Document gateway firmware (image version, build date) and the tag ID in the plant asset register.
- Apply any required country or region wireless certifications if a mini-PCIe radio is installed.
- Schedule periodic SD card health checks — industrial-grade cards have a finite write endurance and should be replaced preventatively.
12. Standards and Protocol References
Engineers working with this platform should consult the official documentation rather than community guides for compliance and certification questions:
- SIMATIC IOT2020 product page (Siemens SCE) — image downloads, release notes, training material
- SIMATIC IOT2020 datasheet (PDF on the SCE portal) — pin-level electrical specifications, certification marks
- Yocto Project documentation — BSP layer structure, supported host distros, build configuration
- Intel Quark X1000 datasheet on Intel ARK — processor register definitions and electrical limits
- OPC Foundation OPC UA specification — interoperability and security profiles
- MQTT v5.0 specification (OASIS) — broker behaviour, QoS levels, topic wildcards
- Siemens Industrial IoT portfolio — successor products (IOT2050) and ecosystem context
Is the SIMATIC IOT2020 the same hardware as a Raspberry Pi?
No. The IOT2020 is built around an Intel Quark X1000 x86 SoC at 400 MHz with 256 MB DDR3 RAM and an Arduino Uno R3-compatible header stack. It shares only the microSD boot concept with a Raspberry Pi; pinout, processor architecture, and software ecosystem differ substantially.
Can the IOT2020 be used as a PROFINET device?
No. The IOT2020 has no PROFINET interface and is not certified to IEC 61131-2. For deterministic PROFINET I/O use the ET 200S / ET 200SP family, or migrate to the SIMATIC IOT2050 Advanced variant which includes a PROFINET device interface.
What is the default login and how do I change it?
Default credentials are documented in the SCE portal release notes for each image revision. Change the password on first login with passwd root, and prefer key-based SSH for production deployments by populating ~/.ssh/authorized_keys and disabling PasswordAuthentication in /etc/ssh/sshd_config.
Which operating system does the IOT2020 run?
A Siemens-supplied Yocto Linux image built around the Poky Krogoth release. Custom images can be rebuilt using the meta-iot2020 BSP layer added to a Poky workspace; the build produces a .wic file that flashes directly to a microSD card.
What replaced the IOT2020?
The SIMATIC IOT2050 family (Basic and Advanced) replaced it. The IOT2050 uses a TI Sitara ARM Cortex-A53 processor, supports industrial temperatures up to 50 °C, and the Advanced variant ships with a PROFINET device interface for direct PLC connectivity.
Why does my IOT2020 reset when I attach an Arduino shield?
USB-only power cannot supply the current demanded by typical Arduino shields. Power the IOT2020 from a regulated 12 V DC source through the barrel jack whenever shields are attached; the USB connection should be used only for programming and serial console access.