PR 記事には広告が含まれています
スポンサーリンク
Translate

Padaukマイコンでダンラムに光るLEDを作りました

スポンサーリンク

Padaukマイコンは安価なため、LEDを点灯させるのに最適な部品です。LEDがランダムに光プログラムを作ってみました

スポンサーリンク

点灯イメージ

6つのLEDを並べで、最初は隣同士のLEDが交互に点滅して、徐々にランダムになっていき、再び交互に点滅するようになるというのを繰り返したいと思います。

点灯は、踏切のようにどちらかが必ず点灯するような感じではなく、一瞬だけ光るようにして、低消費電力で光り続けられるようにしたいです。

スポンサーリンク

プログラム

プログラムの流れとしては、LEDの点灯周期を変数として、最初は一定の周期ですが、時間を追うごとにその周期にランダムな値を加減算して、最終的には完全にランダムにするという方法にしようと思います。

ランダムに関してですが、PadaukのマイコンにはArduinoのようにランダム関数がありません。

また、クロックに関してですが、PadaukはIHRCという16MHzの高速内部発振回路と、ILRCという55kHzの低速内部発振回路が内蔵されています。今回は省電力にしたいので55kHzのILRCを使いたいと思います。

低速なクロックで動作させるため、ランダム値生成に多くの処理をさせることができません。そこで今回は、リッチな処理能力のあるESP32を使って発光パターンを生成(IOレジスタに設定する値を生成)しておいて、Padaukはその発光パターンでLEDを点灯させる(IOレジスタに値を代入)だけという仕組みにしようと思います。

ESP32のプログラム

#define LED1_PIN 1
#define LED2_PIN 2
#define LED3_PIN 3
#define LED4_PIN 6
#define LED5_PIN 5
#define LED6_PIN 4

#define LED1_ON() digitalWrite(LED1_PIN, LOW);
#define LED1_OFF() digitalWrite(LED1_PIN, HIGH);
#define LED2_ON() digitalWrite(LED2_PIN, LOW);
#define LED2_OFF() digitalWrite(LED2_PIN, HIGH);
#define LED3_ON() digitalWrite(LED3_PIN, LOW);
#define LED3_OFF() digitalWrite(LED3_PIN, HIGH);
#define LED4_ON() digitalWrite(LED4_PIN, LOW);
#define LED4_OFF() digitalWrite(LED4_PIN, HIGH);
#define LED5_ON() digitalWrite(LED5_PIN, LOW);
#define LED5_OFF() digitalWrite(LED5_PIN, HIGH);
#define LED6_ON() digitalWrite(LED6_PIN, LOW);
#define LED6_OFF() digitalWrite(LED6_PIN, HIGH);
#define LED_NUM 6
#define OFF_DELAY 200

#define LED1_BIT  (1 << 0)
#define LED2_BIT  (1 << 4)
#define LED3_BIT  (1 << 3)
#define LED4_BIT  (1 << 5)
#define LED5_BIT  (1 << 6)
#define LED6_BIT  (1 << 7)

void setup() {
  Serial.begin(115200);
  delay(2000);
  pinMode(LED1_PIN, OUTPUT);
  pinMode(LED2_PIN, OUTPUT);
  pinMode(LED3_PIN, OUTPUT);
  pinMode(LED4_PIN, OUTPUT);
  pinMode(LED5_PIN, OUTPUT);
  pinMode(LED6_PIN, OUTPUT);
  LED1_OFF();
  LED2_OFF();
  LED3_OFF();
  LED4_OFF();
  LED5_OFF();
  LED6_OFF();
}

void loop() {
  int led_delay[LED_NUM] = { 1, OFF_DELAY / 2, 1, OFF_DELAY / 2, 1, OFF_DELAY / 2 };
  Serial.printf("data[] = { ");
  for (int loopCount = 0 ; loopCount<OFF_DELAY/2*6*10/2/2 ; loopCount++) {
    char data = 0;
    for (int i = 0; i < LED_NUM; i++)
    {
      led_delay[i]--;
      if (led_delay[i] == 0)
      {
        int rand = random(0, loopCount/5/2)-loopCount/5/2/2;
          if( rand > 0)
            rand = 0;
        led_delay[i] = OFF_DELAY + rand;
        switch (i) {
          case 0:
            LED1_ON();
            data |= LED1_BIT;
            break;
          case 1:
            LED2_ON();
            data |= LED2_BIT;
            break;
          case 2:
            LED3_ON();
            data |= LED3_BIT;
            break;
          case 3:
            LED4_ON();
            data |= LED4_BIT;
            break;
          case 4:
            LED5_ON();
            data |= LED5_BIT;
            break;
          case 5:
            LED6_ON();
            data |= LED6_BIT;
            break;
          default:
            break;
        }
      }
    }
    Serial.printf("0x%02x, ",data);
    delay(2);
    LED1_OFF();
    LED2_OFF();
    LED3_OFF();
    LED4_OFF();
    LED5_OFF();
    LED6_OFF();
  }

  while(1)
  {}
}

ESP32のプログラムは上記のようになりました。ESP32で実際にLEDを点灯させて、ランダム具合を見ながらパラメータを調整しました。

ESP32のプログラムを実装した結果

このプログラムを実行すると、LEDが点灯すると共にシリアル出力に点灯パターンの値が出力されます。

このdataの変数をPFS154のプログラムにコピーして利用します。

PFS154のプログラム

#include <pdk/device.h>
#include <stdint.h>
#include "auto_sysclock.h"
#include "delay.h"

#define LED1_BIT         0
#define LED2_BIT         4
#define LED3_BIT         3
#define LED4_BIT         5
#define LED5_BIT         6
#define LED6_BIT         7
#define LED1_ON()     PA &= ~(1 << LED1_BIT)
#define LED1_OFF()    PA |= (1 << LED1_BIT)
#define LED2_ON()     PA &= ~(1 << LED2_BIT)
#define LED2_OFF()    PA |= (1 << LED2_BIT)
#define LED3_ON()     PA &= ~(1 << LED3_BIT)
#define LED3_OFF()    PA |= (1 << LED3_BIT)
#define LED4_ON()     PA &= ~(1 << LED4_BIT)
#define LED4_OFF()    PA |= (1 << LED4_BIT)
#define LED5_ON()     PA &= ~(1 << LED5_BIT)
#define LED5_OFF()    PA |= (1 << LED5_BIT)
#define LED6_ON()     PA &= ~(1 << LED6_BIT)
#define LED6_OFF()    PA |= (1 << LED6_BIT)

const char data[] = { 0x49, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xb0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x49, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x10, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x10, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00};

void main() {
    PDK_USE_FACTORY_IHRCR_16MHZ();
    PDK_USE_FACTORY_BGTR();
    AUTO_INIT_SYSCLOCK();
    CLKMD &= ~CLKMD_ENABLE_WATCHDOG;  // Disenable WDT

    PAC |= (1 << LED1_BIT);          // Set LED pin as output
    PAC |= (1 << LED2_BIT);          // Set LED pin as output
    PAC |= (1 << LED3_BIT);          // Set LED pin as output
    PAC |= (1 << LED4_BIT);          // Set LED pin as output
    PAC |= (1 << LED5_BIT);          // Set LED pin as output
    PAC |= (1 << LED6_BIT);          // Set LED pin as output
  
    LED1_OFF();
    LED2_OFF();
    LED3_OFF();
    LED4_OFF();
    LED5_OFF();
    LED6_OFF();

    while(1)
    {
        for(int i=0 ; i<sizeof(data) ; i++)
        {
            PA = ~data[i];
            _delay_ms(2);
        }
        for(int i=sizeof(data)-1 ; i>0 ; i--)
        {
            PA = ~data[i];
            _delay_ms(2);
        }
    }
}

ESP32で生成したdataをconstとして貼り付けます(25行目)。constにすることで、メモリ空間ではなくROMの空間に割り当てられます。PFS154は2kワードのROM空間があるので、data数を1500個にしました。

31行目でウオッチドッグタイマをOFFしておきます。

51行目で、dataの値をIOレジスタPA(Port A)に代入しています。これによってLEDが点灯します。代入の時に値を反転していますが、ポートがLowの時にLEDが点灯するようマイコンとLEDが配線されているためです。

PaudakはポートAの5番ピン(PA5)はオープンドレインのため電流の吸い込みしかできません。今回はPA5を含む全てのIOピンを使用するため、Lowで点灯とするようにしました。

また点灯データに関してですが、周期的な点灯からランダムな点灯になるまでのデータだけを用意しておいて、それを反対から読む出すことで(54行目以降)、ランダムから周期的に戻るようにし、データ数を半分に減らしています。

参考までに、PFS154のプログラムを貼っておきます。

コンパイルですが、以前紹介した開発環境ではROMのメモリ不足でコンパイルエラーとなってしまいます。おそらく開発環境を作った方が、ワードではなくバイトでメモリの最大値を設定したためと思われます。

このため、フォークして修正しました。

; PlatformIO Project Configuration File
;
;   Build options: build flags, source filter
;   Upload options: custom upload port, speed and extra flags
;   Library options: dependencies, extra library storages
;   Advanced options: extra scripting
;
; Please visit documentation for the other options and examples
; https://docs.platformio.org/page/projectconf.html
[env:development]
platform = https://github.com/kohacraft/platform-padauk.git ; ボードのリポジトリ
board = PFS154 ; 使うマイコンの選択
framework = easypdk ; ヘッダーとかを追加
board_build.f_cpu = 55000
extra_scripts = post:extra_script.py

VSCodeでplatformio.iniの11行目、github.com/以降を「kohacraft」とすることで、パラメータがけ修正され、ROMの最大容量までエラーなくコンパイルが可能となります。

スポンサーリンク

プログラム完成

実際に点灯する様子を見てみると、交互に光っているのがよくわからず、ただ単にランダムに光っているように見えてしまって、ちょっと残念な結果となりました。じーっと見ていると、周期的になっているかもしれないなと思えます。

とりあえず、PFS154を使ってLEDをランダムに点灯させることができました。

次回はこのLED用の基板を設計して発注したいと思います。

スポンサーリンク

ちょっと開発が面倒

プログラムを書き込みためには、マイコンをライターに接続する必要があります。書き込みが終わったら、取り外してブレッドボードに差し込みます。実行してみてプログラムを変更したら、マイコンをブレッドボードから取り外し、またライターへ接続します。このように、何度もマイコンをライターとブレッドボード間で往復する必要がありました。

とても効率が悪いので、マイコンの抜き差ししなくてもいいように、インサーキットライターアダプター見たいな、抜き差しすることなく、書き込みと実装を切り替えられる仕組みを考えたいと思います。

2024.11.6 続きの記事 基板を設計しました