Skip to main content

FPGAのロジックをPython言語でプログラミングし、 IoT アプリを作成

awong
0

IoT は、もはや単なる流行語ではありません。最近では、様々な産業や家電市場で各種の IoT アプリケーションを目にすることと思います。流行りの IoT アプリケーションには、スマートホーム、ウェアラブル、コネクテッドカー、産業用 IoT、そしてスマート農業などがあります

まず今回使用したテクノロジを簡単に紹介します。

Xilinx製 FPGA は、産業用 IoT (IIoT) で幅広く使用されています。その理由は、FPGA は、ソフトウェアによりプログラム可能であること、リアルタイム処理、ハードウェア最適化、そして産業用 IoT システムに必要なセキュリティと安全性を備えた複数対地間接続を組み合わせた、柔軟で標準化されたソリューションを提供できるからです。これらFPGAとARM プロセッサを統合搭載したザイリンクスの Zynq SoC 用いることで、技術者や開発者は、プログラマブル ロジックを用いて高速で受信データを前処理し、その後プロセッサでソフトウェアベースでの運用を行うことが可能となります。

一方、Python言語は、その明快さと可読性から、IoT向けソフトのアプリケーション開発で広く使われています。そして、IoT システムにおけるデータ分析にも適した選択です。コミュニティが大きいため、開発者は、必要なヘルプやライブラリを必要な時に見つけることができます。データ集約型アプリケーションにはうってつけの言語です。

Xilinx製 PYNQ は、Python言語でFPGAロジックをプログラミングしようという、新しいオープンソースフレームワークです。これによってITエンジニアは、ザイリンクスの Zynq All Programmable SoC (APSoCs) の機能を活用できます。ハードロジック回路を理解する必要はありません。プログラマブル ロジック回路はハードウェア ライブラリからインポートし、その API を通じてプログラムします。ソフトウェア ライブラリをインポートし、プログラムすることと、本質的には同じやり方です。PYNQ で Python を使うことで、簡単にハードロジックにアクセスし、高水準なフレームワークを使用することができます。

今回、組込み開発の専門家 アダム・テイラー (Adam Taylor) 氏は、ザイリンクスの PYNQ イメージ、Python、DiligentのFPGAボード「ZYBO Z7」、ザイリンクスの Zynq Soc Platform  (164-3487) 、ザイリンクスの Zynq SoC Platform、Diligent の Pmod ALS 環境光センサー  (134-6463)  、クラウドサービス「adafruit.io」、IFTTT を通じたスマート電球 フィリップスHue を用いて、IoT アプリケーションを作成しています。アダムは、まず ZYBO Z7 に PYNQ を準備し、それから Python でアプリケーションを記述します。その後、ハードウェア  (Zybo Z7 と Pmod ALS) をインターネットに接続し、Adafruit.io と IFTTT を利用して、IoT アプリケーションを動かします。

ZYBO Z7 に PYNQ フレームワークをロードする

アプリケーションは Linux マシン上で設計します。まず最初に、アダムは Ubuntu 16.04. を搭載した仮想マシン (Virtual Machine) を使います ( 注 : 構築環境の作成についてより詳しく知りたい場合には、こちらの PYNQ Edition blog をご覧ください )。そして、github から PYNQ ディレクトリを複製します。

git clone https://github.com/Xilinx/PYNQ.git

ダウンロードしたら、ザイリンクスの Vivado Design Suite でベース アプリケーションを作成し、/PYNQ/Boards/IP ディレクトリ内の利用可能な IP を使用します。Pmod 環境光センサーを使用して以来、アダムは PYNQ Input Output Processor (IOP) を使用します。これは、I/O スイッチに接続する Microblaze プロセッサで、複数のデジタル通信プロトコルに対応します。

IoP Implementation in Xilinx Vivado

ZYBO Z7 Base PYNQ Design

ベース デザインがビルトイン Vivado であれば、アダムは、それをザイリンクスの PetaLinux ツールにエクスポートして、PetaLinux プロジェクトを作成する必要があります。PetaLinux は、エンベデッド Linux 開発ソリューションで、ユーザーは、ザイリンクスの FPGA 上に Linux を展開することができます。(PetaLinux についてあまりご存じない場合には、Digilent Wiki にある Getting Started with PetaLinux をご覧ください)

アダムは次のコマンドを走らせて、PetaLinux のイメージを構築します。これには数分かかることがあります 

petalinux-create — type project — template zynq — name zybo
petalinux-config — get-hw-description 
Petalinux-build 
  

PetaLinux のイメージが構築できたら、アダムは、ハードウェア上で Linux のイメージを確認します。彼は、次のコマンドでテストを行います。これによって、イメージは JTAG のリンクを用いる ZYBO Z7 上にダウンロードされ、動作します。

petalinux-boot –-jtag –-fpga
petalinux-boot –-jtag –-kernel
  

その後、PYNQ のイメージ作成過程に使うボード サポート パッケージ (BSP) を準備します。まず最初に、イメージをパッケージにする必要があります。

petalinux-package --boot --fsblzynq_fsbl.elf --u-bootu-booot.elf --fpgasystem.bit 

これによって、SDCardからブートするのに必要な boot.bin が作成されます。ブートファイルが利用可能となったら、次のコマンドを用いて BSP を作成します。

petalinux-package --bsp -p zybo -o zybo_pynq.bsp

BSP が利用可能となったら、 PYNQ のイメージを作成します。

このために、pynq/boards 内に新しいボード定義を作成します。ZYBO フォルダ内には BSPBit ファイル、そしてボード定義を含めます。

New ZYBO folder

Inside ZYBO folder

それから、次のコマンドを使用して、pynq/sdbuild ディレクトリ内から PYNQ イメージを構築します

make BOARDS=zybo

これが終了すると、イメージは、pynq/sdbuild/output 下で利用可能となります。

PYNQ Output Image

IoT アプリケーション開発

このアプリケーションは、センサー端末の周囲の明るさを Pmod ALSモジュール で測定し、その値をクラウドに書き込み、If This Then That (IFTTT) を使って、フィリップ (Phillips) のスマート電球 「Hue」の点灯消灯を行います。これを始めるには、Message Queuing Telemetry (MQTT) を使用するクラウドサービス「Adafruit.io 」を使用します。ユーザーは、 http://adafruit.io/ でアカウント設定を行って、 adafruit.io ライブラリをインストールする必要があります。

アカウント作成後、AIO キーが作成され、左側の「View AIO Key」から見ることができます。これらのキーは、Python アプリケーションで必要となります。次の段階は、ZYBO によりデータを追加するためフィードの作成です。PYNQ 環境では、アダムはターミナルを開いて、以下のコマンドから adafruit.io パッケージをインストールします。

pip3 install adafruit.io

パッケージをダウンロードしたら、以下の Python スクリプトを PYNQ notebook に書きます( https://pynq.readthedocs.io/en/v2.0/jupyter_notebooks.html からダウンロードできます )。コードでは、ALSセンサーは 5 秒ごとに明るさを測定し、その結果を Adafruit クラウドにアップロードします。

from pynq.overlays.base import BaseOverlay
from pynq.lib import Pmod_ALS 
from Adafruit_IO import Client
import time
overlay = BaseOverlay("base.bit")
overlay.is_loaded()
aio = Client('NAME', 'ID') 
try:
   while True:
       illum = my_als.read()
       aio.send('illumination', illum)
       time.sleep(5)
except KeyboardInterrupt:
       print("CTRL-C!! Exiting...")

その後、アダムは IFTTT を用いて、 adafruit.io クラウドのフィードをモニターします。フィードの値によって、スマート電流 フィリップス Hue ライトを点灯あるいは消灯します。このために、IFTTT アカウントを作成して、新しいアプレットを作成します。IFTTT を adafruit.io. に接続して、適切な明るさを選択し、フィリップスの Hue ライトを制御します。

プロジェクトの詳細については、Digilant社ホームページ内の Project Page からご覧いただけます。ザイリンクスの  FPGA、SoC 開発に関する情報がさらに必要な場合には、MicroZed Chronicles で毎週ご覧いただけます。

Love learn engineering in hands-on approach. Interested in new technology. Work in Digilent as International Sales and Distribution Manager.

Recommended Articles

DesignSpark Electrical Logolinkedin