投稿

ラベル(Embedded)が付いた投稿を表示しています

Linux(Ubuntu) Eclipse STM32 開発環境

イメージ
Linux(Ubuntu) Eclipse STM32 開発環境 久しぶりに、STM32の開発環境について書きます。 開発環境は、おなじみの? Eclipse + SW4STM32 ですが、 開発プラットフォームは、Ubuntu 18.0.4 LTS 64bit です。 前回記事「 EclipseによるSTM32統合開発環境構築 」で紹介した、WindowsのEclipse+SW4STM32と(ほぼ)同様の環境をLinux(Ubuntu 18.0.4 LTS)上に構築する方法について解説します。 ほぼ、と書いたのは後ほど。。。 基本的なソフトウェア構成についてもWindowsとほぼ同じですが、Windowsでは使用するEclipseとしてPleiadesを使っているところをUbuntuでは snap で Eclipseパッケージを直接インストールしたり、ST-LinkがWindowsでは本家STMicroのモノであるのに対してオープンソースを使ったりと、いくつか異なるソフトウェアもあります。 その関係で? Eclipseは英語のままで日本語化していません。 ソース上のコメント表記とかは日本語入力できるし、特に日本語にするメリットも感じられないのでこの記事では英語のママです。 ご容赦を。 また、Windows上での操作と同様の箇所についての詳細は、Windowsでの解説を確認ください。(手抜き!) 使ったOS:  Ubuntu18.0.4 LTS 64bit インストールするソフトウェアの一覧:  STM32 CubeMX  Eclipse  STM32 CubeMX Eclipseプラグイン  SW4STM32 Eclipseプラグイン  CDT Eclipseプラグイン  stlink-tools  その他、説明文中で apt install   (すでにapt install場合は不要) まずは、念の為 $ sudo apt update とかやっておいいてください。 CubeMXもEclipseもJavaで動作するので、まずはJavaの実行環境をインストールします。 $ sudo apt install default-jre STM32 CubeMX...

ArduinoでLCD制御(QAPASS1602)と、c++のお話。

イメージ
ArduinoでLCDを制御する++ いまで、このサイトでは使用するLCDとしてとして AQM1602Y-RN-GBW を使ってきました。  ・ Arduinoを使ってみよう  ・ Arduinoでタイマー割り込み これらの記事でも触れていますが、このLCDモジュールは3.3Vで動作しますがレベル変換など入れず、モジュールの実力で動作しています。 ソフト屋は、こういったトコロがいいかんげんで電気屋が怒るポイントです。 (:P) そこで、今回はArduinoで動作する5VのLCDモジュール、QAPASS1602を手に入れ、マトモな5Vの回路で動作させてみました。 今回は、デバイスを動かすだけ? で、終わらないのがLightning Brains。 そこで、今回はArduino開発環境(c++)についてちょいとばかし 掘ってみました。  目次:            ・ QAPASS 1602とは?  ・ さっそくLCDモジュールを使ってみよう  ・ まずは、”Hello World.”を表示させてみよう   ・ Arduino IDEを掘ってみる!  ・ Arduino IDEって、c++じゃん?  ・ main.cppからいじってみる  ・ Arduino IDEを使ったc++開発は可能か? QAPASS 1602とは? Amazonでも入手できるので、Arduinoな世界では標準的なデバイスなんでしょうか? 価格も500円前後、ずいぶん安いトコロもありますがソコは各自で判断して購入ください。 モジュールの仕様も、バックライトあり・ナシなど違いがあるので気をつけてください。     このLCDモジュールですが、コントローラーは HD44780 という日立が大昔に作ったモノが今でも標準として使われています。これらのモジュールはその互換品が使われているようです。 このコントローラーの特徴としては、データ線を4本して通信できるところです。その他に制御線が2本必要なので、全部で6本のデジタル出力が必要になります。 データ線が4本なので、実際にデータを1バイト送る際には、上位4ビットと下位4ビットに分けて送る必要があります...

Arduinoでタイマー割り込み

イメージ
Arduinoでタイマー割り込み 前回の記事( Arduinoを使ってみよう )で簡単な時間計測プログラムを作成しましたが実は正確ではありません。 なぜならば、デッドラインを意識したリアルタイム設計が成されていないからです。 そこで、今回は、Arduinoのタイマー割り込みを使ってより正確な時刻計測を行うプログラムを作成してみましょう。  目次:            ・ デッドラインとは?  ・ タイマーで1秒間隔の割り込みを作るには?   ・ 正確なストップウォッチを作ってみる! デッドラインとは? なぜ、前回のタイマー処理では正確な時間計測ができないのでしょうか? 処理を時間で見てみると下記のようになっています。 LCDへの表示を行い、その後1ミリ秒のディレイを行っています。 1回の処理時間は下記のようになります。  処理時間 = LCD表示処理時間 + 1ミリ秒ディレイ LCDの表示にかかる処理時間は短いものですが、使い続けると誤差が大きくなってしまいます。 組み込み機器は、電源を入れられるとそのまま動き続けることが多いため、このような誤差も問題になってきます。 或いは、実際の競技計測のように厳密な計測を求められるような場合も同様です。 そこで、下記のように1秒の間隔の間でLCDの表示処理を行うようにする方法が考えられます。 このような処理形態とした場合、 必ず1秒以内に処理を完了しなければなりません 。 この1秒という時間が『 デッドライン 』になります。 上記の図では、2つ目の1秒の間隔で処理が終わることができませんでした。 このような場合、次の1秒の処理に影響が出てしまうため、このような状況は避けなければなりません。  だから、『 デッドライン 』といいます。 また、このデッドラインを意識した設計は、組み込み機器のリアルタイム性能に大きく影響を及ぼします。 さて、ではどうやって1秒の間隔を作り出せばよいのか? このブログの以前の記事「 STM32F3 Discovery、タイマーと割り込みのキホン 」ではタイマーで割り込み駆動してLEDをソフトPWMで制御しました。 Arduinoでも同様に、タイマーによる割り込みが可能です。 ...

Arduinoで割り込み処理

イメージ
Arduinoで割り込み処理 Arduinoだって割り込み処理、できるもん。 今回は、Arduinoを使った割り込み処理についてです。 さて、今回もArduino Microを使ってのコードです。  目次:            ・ スイッチ状態を読み取る  ・ スイッチの状態変化を割り込みで受け取る   スイッチ状態を読み取る まずは、外部にタクトスイッチを取り付けてArduinoで受け取るプログラムを作成してみましょう。 回路図は、下記のようになります。 この回路では、電源電圧5Vを220Ωの抵抗を挟んでデジタル入力の12とスイッチに接続しています。スイッチのもう1方はGNDに接続としています。 このような接続方法を”プルアップ接続”といいます。 この接続方法では、ボタンを押さない状態ではデジタル入力ピンに電圧がかかっているため、HIGHとして認識され、ボタンを押すとGND側に電流が流れるためLOWなることでボタンが押されたことを検出できます。 実際に使うスイッチはタクトスイッチです。 ブレッドボード上ではこんな感じになります。 まずは、簡単なプログラムとしてスイッチが押された状態ならば、ボード上のLEDを点灯し、離された状態ならばLEDを消灯するプログラムを作成してみましょう。 プログラムは、下記のようになります。 スイッチの状態を検出するプログラム const byte LED_PIN = 13; const byte INPUT_PIN = 12; void setup() { // Digital Pin設定 pinMode(LED_PIN, OUTPUT); // On-Board LED pinMode(INPUT_PIN, INPUT); } void loop() { if(digitalRead(INPUT_PIN) == LOW) { digitalWrite(LED_PIN, HIGH); } else { digitalWrite(LED_PIN, LOW); } } デジタル入出力12番を入力に設定し、ボード上のLEDを点灯するためデジタル入出力13番を出力に設定...

Arduinoを使ってみよう

イメージ
今回は、小学生でもプログラミングしてロボットなどを制御できるArduinoです。 ええい!俺はコテコテの組み込み屋だ!! などと仰る方も、プロト作成なんかには便利此上ありません。 今日は、そんなArduinoの使い方の基本についてです。  目次:            ・ Arduinoとは?  ・ Arduinoのライセンス  ・ Arduinoの開発環境  ・ Arduinoのプログラミング  ・ まずは、「Hello World」  ・ LEDを点滅させる(Lチカ!)  ・ 別のシリアルも使ってみる  ・ I2Cのデバイスを使ってみる(LCD) なお、この記事では開発用のPCには、Windows 10 (1903) 使用するArduinoボードは、Microを使っています。 Arduinoとは? 「Arduino:アルデュイーノ」と読みます。 イタリアンな感じの発音、そう思った方は正解です。 それは2005年、北イタリアのイヴレーアという街のインタラクションデザイン工科大学(IIDI)から始まりました。 5人の人物たちが学生でも気軽に使えるような安価で、かつ、簡単に使えるコントローラー、つまりワンボードマイコンを作って販売する「Arduinoプロジェクト」から始まりました。 そして、彼らは、シンプルな設計のボードだけではなく技術者ではなくても開発が可能な開発環境の開発に成功し、ハードウェア・ソフトウェアともにオープンとなものとして公...

STM32F3 Discovery、タイマーと割り込みのキホン

イメージ
STM32F3 Discovery、タイマーと割り込みのキホン 今回のSTM32F3 Discovery企画では、基本的なタイマー動作についての設定と、そのタイマーを割り込みで使うための基本について解説したいと思います。 写真ではわかりづらいですが、タイマーでPWM制御しています。 STM32F303は、タイマーとしてTIM1, TIM2, TIM3, TIM4, TIM6, TIM7, TIM8, TIM15, TIM16, TIM17 と10個のタイマーを持っています。(なぜ番号が飛んでいるのかは不明) この中で、TIM1と8は高機能なタイマーとして実装されていますが、今回の記事ではTIM1を使ったプログラミングを行いたいと思います。 また、タイマーとともに割り込みでの処理を行いたいので、割り込み設定についても解説していきます。 なお、このサンプルではタイマー設定などについて、直接レジスタ設定で実現しています。 レジスタ、割り込みの定義は、stm32f303xc.hで行われています。他のSTM32を利用する場合、それぞれのMPUに適したヘッダファイルが存在していますので、そちらのヘッダーファイルを参照してください。 stm32f303xc.h 中で、TIM1に関するレジスタのベースアドレスや各操作レジスタが定義されていて、  TIM1->PSC = 4800;  → TIM1タイマーのプリスケーラーレジスタに4800を設定する の、ような記述が可能になります。 一般的にMCUのタイマーは、タイマーモジュールに供給されているクロックをカウントすることで、ある時点からどのくらい時間が経過したかを測るものです。 このため、使用するタイマーモジュールに供給されるクロック数を確認しないと正確なタイマー設定を行うことができません。 タイマー1(TIM1)は、STM32F303xB STM32F303xCデーターシート(DS9118.pdf)のブロックダイアグラム(13/149)を確認すると、APB2/72MHzに接続されています。しかし、実際に供給されているクロック設定をCubeMXで確認すると、48MHzとなっています。Eclipse CubeMXのパースペクティブのClockConfigurationを確認して...