SIMATIC IOT2020: Yocto Linux, Arduino, MQTT Gateway Setup Guide

David Krause15 min read
PLC HardwareSiemensTechnical Reference
Licensed PE Working through this on a live machine? A Maine-licensed engineer can take it from here — included with IMD hardware, by the hour for everything else. Book an engineer

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.

Product status: The IOT2020 reached end of life around 2018 and was succeeded by the SIMATIC IOT2050, which uses a TI Sitara ARM Cortex-A53 processor and supports industrial operating temperatures. The IOT2020 remains usable as a low-cost training, prototyping, and education gateway, but it is not rated for unattended industrial environments. Always confirm the current ordering and lifecycle status against the official Siemens SCE portal before committing to a design.

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
Voltage caution: Although Arduino shields conventionally assume 5 V logic, the Quark SoC GPIOs are 3.3 V. Use only shields that operate at 3.3 V or include on-board level translation. Applying 5 V to a digital input on an unmodified IOT2020 risks damaging the Quark silicon. Confirm shield IOREF behavior before stacking.

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 dd on Linux/macOS
  • USB Type B cable for serial console access (115200 8N1) in case Ethernet provisioning fails

5.2 Flashing procedure

  1. 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.
  2. Insert the microSD card into the host PC. Confirm the device path with lsblk on Linux or Disk Utility on macOS. Confirm the target device letter on Windows.
  3. Flash the image with dd (Linux example):
    sudo dd if=iot2020-image.wic of=/dev/sdX bs=4M status=progress conv=fdatasync
    sync
    On Windows, use Win32 Disk Imager or balenaEtcher and select the .wic directly. balenaEtcher accepts raw images and verifies the write automatically.
  4. 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.
  5. 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.
  6. 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 with passwd.

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

  1. Verify power supply: regulated 12 V DC ± 5 %, 1 A minimum. Confirm polarity before applying power.
  2. Insert flashed microSD before power-up. Cold-boot only — hot-plugging the SD card is not supported.
  3. Capture the DHCP lease or assign a static IP via systemd-networkd and document the address on the asset register.
  4. Update the root password on first login. Disable password SSH if key-based authentication is used in production.
  5. Configure NTP and verify with timedatectl status. System clock synchronized: yes is required for log correlation.
  6. 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).
  7. Smoke-test MQTT or OPC UA publishing against the broker or SCADA; verify QoS 1 acknowledgements if used.
  8. Document gateway firmware (image version, build date) and the tag ID in the plant asset register.
  9. Apply any required country or region wireless certifications if a mini-PCIe radio is installed.
  10. 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:

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.

Back to blog