Infineon Team
Published © MIT

Sneak Peek Embedded World 23

Get a glimpse on one of our demos at this years Embedded World

IntermediateFull instructions provided8 hours230
Sneak Peek Embedded World 23

Things used in this project

Hardware components

XMC2GO - industrial microcontroller kit
Infineon XMC2GO - industrial microcontroller kit
×1
S2GO SECURITY OPTIGA M
Infineon S2GO SECURITY OPTIGA M
×1
Eaton Eaton Moeller Series Push Button, Panel Mount, SPDT, IP69K
×1

Software apps and online services

Arduino IDE
Arduino IDE

Hand tools and fabrication machines

3D Printer (generic)
3D Printer (generic)
Soldering iron (generic)
Soldering iron (generic)

Story

Read more

Custom parts and enclosures

120mm DICE lower part

120mm DICE upper part

Code

Cryptographic Dice_V2

Arduino
Main code to run the application.
Create a random number and display it via WS2812 LEDs.
#include <Adafruit_NeoPixel.h>
#define PIN 4
#define NUMPIXELS 7 * 6
#define BRIGHTNESS 255  // Reduce brightness if you have issues with PSU
Adafruit_NeoPixel pixels(NUMPIXELS, PIN, NEO_GRB + NEO_KHZ800);

#include "OPTIGATrustM.h"

#define RND_LENGTH 8

bool displayNumber(uint8_t number, uint32_t color);
bool valid_number = true;

// Define colours
uint32_t colors[] = {
  pixels.Color(200, 200, 200),  // Engineering
  pixels.Color(0, 255, 255),    // Ocean
  pixels.Color(0, 255, 0),      // Lawn
  pixels.Color(255, 0, 200),    // Berry
  pixels.Color(255, 110, 0),    // Sun
  pixels.Color(255, 255, 0)     // Sand
};

void setup() {
  /* Prepare status LED on XMC 2Go */
  pinMode(LED1, OUTPUT);
  digitalWrite(LED1, LOW);

  /* Initialise an OPTIGA™ Trust X Board */
  uint8_t ret = trustM.begin();
  while (ret) {
    delay(5);
    ret = trustM.begin();
  }

  /* Speedup the board (from 6 mA to 15 mA) */
  trustM.setCurrentLimit(8);

  /* Initialise the Display LEDs */
  pixels.begin();  // INITIALIZE NeoPixel strip object (REQUIRED)
  pixels.setBrightness(BRIGHTNESS);
  pixels.clear();  // Set all pixel colors to 'off'
}

void loop() {
  /* Toggle status LED to show number generation is ongoing */
  digitalWrite(LED1, HIGH);

  uint32_t ret = 0;
  uint8_t cntr = 10;
  uint8_t *rnd = new uint8_t[RND_LENGTH];
  uint32_t ts = 0;

  /* Initialise Memmory Area */
  memset(rnd, 0, RND_LENGTH);

  /*Generate Random value */
  ret = trustM.getRandom(8, rnd);
  uint8_t rnum = rnd[0] / 34;

  // Roll the dice
  if (valid_number) {
    uint32_t delay_ms = 50;
    for (uint8_t n = 0; n < 3; n++) {
      for (uint8_t i = 0; i < 6; i++) {
        /* Display each number in different color */
        displayNumber(i + 1, colors[i]);
        delay(delay_ms);
        delay_ms += 6;
      }
    }
  }

  /* Display number if between 1-6, else return false */
  valid_number = displayNumber(rnum, colors[rnum - 1]);

  /* Remove dynamically allocated data */
  delete rnd;

  if (valid_number) {
    digitalWrite(LED1, LOW);  // Run was successfull, turn of status LED.
    while (1) delay(1000);
  }  //don't run again in case a number is displayed
}

bool displayNumber(uint8_t number, uint32_t color) {
  switch (number) {
    case 1:
      pixels.clear();
      for (int i = 0; i < 6; i++) {
        pixels.setPixelColor(3 + i * 7, color);
      }
      pixels.show();
      break;
    case 2:
      pixels.clear();
      for (int i = 0; i < 6; i++) {
        if (i == 1) {
          pixels.setPixelColor(2 + i * 7 - 1, color);
          pixels.setPixelColor(4 + i * 7 + 1, color);
        } else if (i == 2) {
          pixels.setPixelColor(2 + i * 7 - 1, color);
          pixels.setPixelColor(4 + i * 7 + 1, color);
        } else {
          pixels.setPixelColor(2 + i * 7, color);
          pixels.setPixelColor(4 + i * 7, color);
        }
      }
      pixels.show();
      break;
    case 3:
      pixels.clear();
      for (int i = 0; i < 6; i++) {
        if (i == 1) {
          pixels.setPixelColor(2 + i * 7 - 1, color);
          pixels.setPixelColor(3 + i * 7, color);
          pixels.setPixelColor(4 + i * 7 + 1, color);
        } else if (i == 2) {
          pixels.setPixelColor(2 + i * 7 - 1, color);
          pixels.setPixelColor(3 + i * 7, color);
          pixels.setPixelColor(4 + i * 7 + 1, color);
        } else {
          pixels.setPixelColor(2 + i * 7, color);
          pixels.setPixelColor(3 + i * 7, color);
          pixels.setPixelColor(4 + i * 7, color);
        }
      }
      pixels.show();
      break;
    case 4:
      pixels.clear();
      for (int i = 0; i < 6; i++) {
        if (i == 1) {
          pixels.setPixelColor(0 + i * 7, color);
          pixels.setPixelColor(2 + i * 7 - 1, color);
          pixels.setPixelColor(4 + i * 7 + 1, color);
          pixels.setPixelColor(6 + i * 7, color);
        } else if (i == 2) {
          pixels.setPixelColor(0 + i * 7, color);
          pixels.setPixelColor(2 + i * 7 - 1, color);
          pixels.setPixelColor(4 + i * 7 + 1, color);
          pixels.setPixelColor(6 + i * 7, color);
        } else {
          pixels.setPixelColor(0 + i * 7, color);
          pixels.setPixelColor(2 + i * 7, color);
          pixels.setPixelColor(4 + i * 7, color);
          pixels.setPixelColor(6 + i * 7, color);
        }
      }
      pixels.show();
      break;
    case 5:
      pixels.clear();
      for (int i = 0; i < 6; i++) {
        if (i == 1) {
          pixels.setPixelColor(0 + i * 7, color);
          pixels.setPixelColor(2 + i * 7 - 1, color);
          pixels.setPixelColor(3 + i * 7, color);
          pixels.setPixelColor(4 + i * 7 + 1, color);
          pixels.setPixelColor(6 + i * 7, color);
        } else if (i == 2) {
          pixels.setPixelColor(0 + i * 7, color);
          pixels.setPixelColor(2 + i * 7 - 1, color);
          pixels.setPixelColor(3 + i * 7, color);
          pixels.setPixelColor(4 + i * 7 + 1, color);
          pixels.setPixelColor(6 + i * 7, color);
        } else {
          pixels.setPixelColor(0 + i * 7, color);
          pixels.setPixelColor(2 + i * 7, color);
          pixels.setPixelColor(3 + i * 7, color);
          pixels.setPixelColor(4 + i * 7, color);
          pixels.setPixelColor(6 + i * 7, color);
        }
      }
      pixels.show();
      break;
    case 6:
      pixels.clear();
      for (int i = 0; i < 6; i++) {
        pixels.setPixelColor(0 + i * 7, color);
        pixels.setPixelColor(1 + i * 7, color);
        pixels.setPixelColor(2 + i * 7, color);
        pixels.setPixelColor(4 + i * 7, color);
        pixels.setPixelColor(5 + i * 7, color);
        pixels.setPixelColor(6 + i * 7, color);
      }
      pixels.show();
      break;
    default:
      /* No valid number entered. Return fail, try again */
      return false;
      break;
  }
  /* Valid number entered and displayed */
  return true;
}

Optiga TrustM Arduino Library

Credits

Infineon Team
104 projects • 167 followers
Contact

Comments

Please log in or sign up to comment.