概要
この記事は、2026年正月に秋月電子で販売されていた「お楽しみ袋」に入っていた、少し行き場に困っていそうなPropellerちゃんたちに手を差し伸べよう、という趣旨の内容です。
( ・∀・)つ スッ
というわけで、年明けに購入した秋月電子のお楽しみ袋を開封してみたところ、PARALLAX社のPropeller QuickStartという開発ボードが入っていました。
せっかく手元に来たからには、ただ引き出しの奥に眠らせてしまうのももったいないところ。そこで本記事では、このPropeller QuickStartを実際に動かしながら、まずは定番のLチカまでを目標に、基本的な使い方を確認していこうと思います。
Propeller系マイコンに初めて触れる人や、同じようにお楽しみ袋で手に入れて扱いに困っている方の参考になれば幸いです。
スペック
Propeller QuickStartに搭載されているマイコンチップは、Propeller 1 (P8X32A) です。
まずは、マイコンチップの基本的なスペックを確認してみましょう。
| 項目 | 内容 |
|---|---|
| チップ名 | Propeller 1 (P8X32A) |
| アーキテクチャ | 32bit 8コア(8 Cog) |
| 動作電圧 | 3.3 V |
| 動作温度範囲 | -55 ~ +125 ℃ |
| 最大実行性能 | 最大160 MIPS(1 Cogあたり20 MIPS) |
| GPIOピン | 32本(全Cogからアクセス可能) |
| 外部クロック | DC ~ 80 MHz |
| 内蔵RCオシレータ | 約12 MHz / 約20 kHz |
| Hub ROM | 32 KB |
| Hub RAM | 32 KB |
| Cog RAM | 2KB / Cog |
| 対応言語 | Spin、Assembly、C/C++(Propeller GCC)、BlocklyProp |
Propeller P8X32Aの最大の特徴は、8つのコアを搭載したマルチコア構成です。Propellerでは、コアのことをCogと呼ぶようです。
各Cogは、それぞれ専用のメモリ(Cog RAM)を持っており、独立してプログラムを実行できます。一方で、複数のCogが連携する場合は、グローバルメモリ(Hub RAM)を介してデータをやり取りします。
また、32本のGPIOピンは すべてのCogから直接アクセス可能となっており、特定のコアにI/Oが固定されていない点も面白いですね。
Parallax社公開の Propeller P8X32Aデータシートより引用
出典: https://www.parallax.com/package/p8x32a-propeller-datasheet/
続いて、開発ボードについても簡単に見ていきましょう。
Propeller QuickStartには、あらかじめ
- 8 個の LED(GPIO16~23)
- 8 個の抵抗膜式タッチセンサー(GPIO0~7)
が搭載されています。
また、USBシリアル変換IC、電源レギュレータ、水晶振動子も実装されており、外部回路を追加しなくても、このボード単体でプログラムの開発や動作確認が可能です。
開発環境の構築
Propellerの開発では、主に次のような言語を使用できるようです。
- Spin:ParallaxがPropeller向けに開発した独自の高水準言語
- Propeller Assembly (PASM):低水準アセンブリ言語
- Propeller C:GCCをPropeller向けに移植したpropeller-gccを使用
- BlocklyProp:ビジュアルプログラミング言語
本記事では、学習コストが比較的低くそうなPropeller Cを使った開発環境の構築手順を紹介します。
Propeller Cについては、以下のページに公式のチュートリアルがあります。
必要なもの
- Propeller QuickStart
- USB mini-Bケーブル
- PC(Windows / macOS / Linux)
Simple IDEのインストール
以下の公式ページからSimple IDEをインストールします。
Simple IDEは、Windows / macOS / Linux に対応しています。
本記事では、Windows版を例に解説します。
ソフトの起動
インストールが完了したら、Simple IDEを起動してみましょう。
初回起動時には、ワークスペースの指定を求められます。
PCとPropeller QuickStartの接続
USB mini-Bケーブルを使用して、PCとPropeller QuickStartを接続します。
接続後は、PCに正しく認識されているか確認しましょう。
Simple IDE上で新しい COM ポートが表示されていれば、正常に認識されています。
新しく増えたポートを選択しておきます。
Propeller QuickStartを使用するには、FTDIドライバー が必要です。通常はIDEと一緒にインストールされているはずですが、PCがQuickStartを認識しない場合は、以下のサイトからドライバーのインストールを試してください。
https://ftdichip.com/drivers/vcp-drivers/
プログラムのビルドと書き込み
まずは、デフォルトで開かれているサンプルプログラムを実行してみましょう。
このプログラムは、シリアルターミナルに 「Hello!」 と表示する簡単なものです。
プログラムのビルドや書き込みは、Simple IDE画面上部に並んでいるアイコンから行います。
これらのアイコンは、左から順に以下の操作を意味します。
- ビルドおよびアップロードの停止
- ビルドのみ実行
- ビルドして EEPROM に書き込み(電源を切っても内容が保持される)
- ビルドして RAM に書き込み(電源を切ると消える)
- ビルドして RAM に書き込み後、シリアルターミナルを起動
シリアルターミナルだけを開きたい場合は、画面上部メニューの
「Program」→「Open Terminal」 から開くこともできます。
今回は、一番右のアイコンをクリックし、プログラムを書き込んだあとにシリアルターミナルを起動します。
ターミナルが開き、「Hello!」と表示されれば成功です!
Lチカ
それでは、本題のLチカに挑戦してみます!
新規プロジェクトの作成
まずは、新しいプロジェクトを作成します。
画面上部メニューから、「Project」→「New」を選択しましょう。
次に、プロジェクト(ファイル)名を入力します。
今回は、「Blink.c」としました。
プロジェクトの種類はC Projectを選択します。
C++ Projectも選べますが、まずはデフォルトのままC Projectで進めていきます。
Lチカのプログラム
LEDを点滅させるプログラムを書きます。
エディタに表示されているコードを、次のように書き換えてください。
Windows 版の Simple IDE では、エディタ上で日本語を直接入力するとクラッシュしました。コメントを書く際は注意してください。
外部エディタで入力した日本語をコピー&ペーストは大丈夫でした。
#include "simpletools.h"
int main()
{
while(1)
{
high(16); // GPIOの16ピンをHIGHに設定
pause(1000); // 1秒待機
low(16); // GPIOの16ピンをLOWに設定
pause(1000); // 1秒待機
}
}
このプログラムでは、GPIOの16番ピンに接続されたLEDを1秒ごとに点灯・消灯させています。
正しく動作していれば、下の写真のようにP16のLEDが一定の間隔で点滅するはずです。
マルチコアでLチカ
コアが8個もあるのにLEDを1つ光らせるだけでは味気ないです。
次は、複数のcogを同時に動かすマルチコアプログラムに挑戦してみましょう。
#include "simpletools.h"
// ==================================================
// 共用メモリ(全cogからアクセス可能)
// ==================================================
volatile int led16_enable = 0;
volatile int led17_enable = 0;
volatile int led18_enable = 0;
// ==================================================
// プロトタイプ宣言
// ==================================================
void blink16();
void blink17();
void blink18();
// ==================================================
// main 関数(cog 0 で実行される)
//
// ・他の cog を起動する
// ・共用メモリを書き換えて LED の状態を制御する
// ==================================================
int main()
{
// 各LED制御用関数を、別々のcogで起動
// 第2引数の 128 は「スタックサイズ」を表す
cog_run(blink16, 128); // P16 を制御する cog
cog_run(blink17, 128); // P17 を制御する cog
cog_run(blink18, 128); // P18 を制御する cog
// LEDを順番に点灯させるループ
while(1)
{
// LED16のみ点灯
led16_enable = 1;
led17_enable = 0;
led18_enable = 0;
pause(100);
// LED17のみ点灯
led16_enable = 0;
led17_enable = 1;
led18_enable = 0;
pause(100);
// LED18のみ点灯
led16_enable = 0;
led17_enable = 0;
led18_enable = 1;
pause(100);
}
}
// ==================================================
// 以下の関数は、それぞれ別の cog で実行される
// ==================================================
void blink16() {
while(1)
{
// main cog が書き換えたフラグに応じて LED を制御
if(led16_enable) high(16);
else low(16);
}
}
void blink17() {
while(1)
{
if(led17_enable) high(17);
else low(17);
}
}
void blink18() {
while(1)
{
if(led18_enable) high(18);
else low(18);
}
}
このプログラムでは、main関数がcog 0で動作し、共有メモリ上のフラグを更新します。各LED制御用の関数は別々のcogで実行され、フラグを参照してLEDの点灯状態を切り替えています。
処理の割り振り
各cogに処理を割り振るには、cog_run関数を使用します。
cog_run()は、新しいcogを起動し、指定した関数をそこで実行させます。
cog_run(blink16, 128);
- 第1引数:実行させたい関数へのポインタ
- 第2引数:そのcogに割り当てるスタックサイズ
スタックサイズには、関数内で使用するローカル変数や関数呼び出しに必要な作業領域が確保されます。
128を指定した場合、128 × 32bit = 512byte分のスタック領域が確保されます。
関数の制約
cog_run()によって実行される関数には、いくつかの制約があります。
- 引数を取れない
- 戻り値を持てない
- cogを意図的に停止させる場合を除き、すべての処理はwhile(1)ループの中に記述する
-
printやscanなどの関数を扱うには特別な処理が必要
void blink16() {
while(1)
{
if(led16_enable) high(16);
else low(16);
}
}
共用メモリ
Propellerでは、異なるcogで動作している処理同士が、グローバル変数を通してデータを共有できます。このように、複数のcogからアクセスされるメモリ領域を、ここでは「共用メモリ」と呼びます。
共用メモリとして使用する変数を宣言する際には、必ずvolatileキーワードを付ける必要があります。
volatile int led16_enable = 0;
あとがき
今回、初めてPropeller系マイコンに触れてみましたが、ArduinoやRaspberry Piとはまた違った設計思想を持つ、非常に個性的なマイコンだと感じました。
Propeller 1(P8X32A)は2006年に登場した比較的古いデバイスですが、2020年には後継となるPropeller 2(P2X8C4M64P)も発売されています。ガラパゴス的な進化を遂げており、非常に興味深いです。









