AVR Programming: Learning to Write Software for Hardware

AVRのSPIモジュール / EEPROM 25LC256 / とにかく何かを書き込んで読み出してみる

pp.339ff. 今度は、テキストが題材にしているEEPROM 25LC256を試してみる。とりあえず何かを書き込んでそれを読み出してみる。 #include <avr/io.h> #include <util/delay.h> extern "C" { #include "USART.h" } int main(){ DDRB |= (1 << PB2); // PB2を!SS端子(OUT)として使う。 P</util/delay.h></avr/io.h>…

AVRのSPIモジュール / 熱電対 & MAX31855 / ライブラリー化

pp.339ff. (ISPとGPIOとの衝突回避については電子工作のための PIC16F1ファミリ活用ガイドブック, p.98) せっかくなので簡単なライブラリーにした。 ▶MAX31855サンプルファイルを開く/閉じる ▶MAX31855ライブラリーを開く/閉じる ▶mySPIライブラリーを開く/…

AVRのSPIモジュール / MISOでとにかく何かを受けてみる / 熱電対 & MAX31855

pp.339ff. 「SPIで何かを読み出してみる / K型熱電対とMAX31855 (5V版) / MAX31855内部で線形変換した温度を読む -」で使った温度センサーから熱接点温度をMISOで受けてみる。 MAX31855はセレクトされればクロックに同期して勝手にデータを送り返してくれる…

AVRのSPIモジュール / MOSIからとにかく何かを出してみる

pp.339ff. #include <avr/io.h> #include <util/delay.h> int main(){ DDRB |= (1 << PB2); // PB2を!SS端子(OUT)として使う。 PORTB |= (1 << PB2); // 最初はスレーブセレクトを解除しておく(Hを出力しておく)。 DDRB |= (1 << PB3); // PB3をMOSI端子(OUT)として使う。 PORTB |= (</util/delay.h></avr/io.h>…

ステッパーモーター / ゆっくり加速、ゆっくり減速

pp.334-335 脱調しないよう、加速、巡航、減速の3ステージで構成された台形駆動をしてみる。ここでは単純に、静止→加速→巡航→減速→静止という動作を試す。下のコードは1ステップごとに加減速をしているので、速度はステップ数に対しては線形変化するが時間に…

ステッパーモーター / タイマーを直接使って回転速度を制御する

pp.329-332 前回は、励磁から励磁までの時間を_delay_us()函数で設定したが、今度はテキストどおりにタイマーのコンペアマッチで設定する。 8 MHzを1024分周した7.8125 kHzをカウントするので1ティックは128 usec。したがってコンペア値0のときは128 usec (=…

ステッパーモーター / ただ回してみる

今度はSN754410を使ってただ回してみる。 #include <avr/io.h> #include <util/delay.h> int main(){ const uint8_t Phases[] = { // 必要な励磁状態を定義しておく。フルステップ。 (1 << PB0) | (1 << PB2), (1 << PB0) | (1 << PB3), (1 << PB1) | (1 << PB3), (1 << PB1) | (1 <<</util/delay.h></avr/io.h>…

ステッパーモーター / 人力パルスで動作確認

参考: 基礎からのマイコンモーター制御(8):バイポーラ型ステッピングモーターの制御 (1/5) - MONOist(モノイスト) ハイブリッド、2相、バイポーラ、360度/200ステップのステッパーSM-42BYG011を動かす。ひとまず人力パルスで動かしてみる。1…

ステッパーモーター / ハーフHブリッジSN754410を使う

バイポーラ、2相のステッパーモーターを使うことにするのでハーフHブリッジが4個(フルHブリッジが2個)必要である。ここではディスクリートでは組まずに、ハーフHブリッジが4個内蔵されたSN754410を使う。 模式的に描くと下のようなハーフブリッジが4個入って…

DCモーター / Hブリッジで正転、反転を切り換える / Locked Anti-phaseモードで速度を制御する

pp.316-317 Hブリッジの左右に逆相のpwmを印加する。デューティだけで回転方向も回転速度も制御する。 #include <avr/io.h> #include <util/delay.h> #include "mylib.h" void initTimer0(){ TCCR0A |= (1 << COM0B1); // コンペアマッチ時にOC0B (PD5)をクリア、ボトム時にOC0B (PD5</util/delay.h></avr/io.h>…

DCモーター / Hブリッジで正転、反転を切り換える / Sign-Magnitudeモードで速度を制御する

p.316 回路は前回のDCモーター / Hブリッジで正転、反転を切り換える -と同じである。回転方向(Sign)と回転速度(Magnitude)とを指定する。具体的にはどちらか一方の制御ラインをHに固定して回転方向を決め、他方にpwmに印加して回転速度を決める(どちらか一…

DCモーター / Hブリッジで正転、反転を切り換える

pp.307-314 Hブリッジを使う。ICは使わずにディスクリートで組んだ。モーターはタミヤソーラーモーター02を使った。DCモーター / 回転速度をpwmで制御する -のときは1.5Vで駆動したがそれではIRF530/9530が動作しないため今回は5Vで駆動した。ただしAVR側の…

DCモーター / 回転速度をpwmで制御する

pp.289-305 タミヤのソーラーモーター02をほぼ無負荷の状態でNチャンネルMOSFET「2N7000」でドライブしてみる。回転速度はpwmで制御する。 #include <avr/io.h> #include <util/delay.h> #include "mylib.h" extern "C" { #include "USART.h" } #define DELAY 10 void initTimer0(){ </util/delay.h></avr/io.h>…

DDS (direct-digital synthesis) / エンベロープジェネレーター / キー入力で割り込みをかける

前回はポーリング方式でキー入力を監視したが、今回はキー入力の受信時に割り込みをかけてキー入力を取り込む。違いは認識できない。 #include <avr/io.h> #include <avr/interrupt.h> #include "scale.h" extern "C"{ #include "USART.h" } #define FULL_VOL 31 // 最大音量。5ビット値</avr/interrupt.h></avr/io.h>…

DDS (direct-digital synthesis) / エンベロープジェネレーター

pp.282-287 その他: 音楽・動画・ゲームに活用! ソフトシンセ 音作り大全, p.22 いわゆるADSR方式でエンベロープカーブが設定できるようにしてみる。 lookupPitch()で返しているC1やC2はscale.hに定義してある。 #include <avr/io.h> #include "scale.h" extern "C"{ #</avr/io.h>…

DDS (direct-digital synthesis) / フェイザーを通したような音を出す

pp.279-282 互いに位相のずれてゆく複数の波形(ここではのこぎり波を4波)を合成してフェイザーの効果を出してみる。 youtu.beyoutu.be 4波とも位相をずらさないで合成したときの波形: #include <avr/io.h> #include <math.h> #define NUM_OF_OSCILLATORS 4 // 何波合成するか。</math.h></avr/io.h>…

DDS (direct-digital synthesis) / 正弦波を生成する

pp.271-278 DDSで正弦波を生成してみる。「LEDをぼわーんと光らせる」の明暗周波数を可聴周波数まで高速化するだけのことである。 左はDDS出力を直接観測した波形。pwmのパルス幅が高速に変化しているだけである。このままでもスピーカーに通せば鳴る。 右は…

footstep detector / 振動が検出されたときにLEDを点ける

これでほぼ完成形。振動が検出されたらある程度の時間だけLEDを点灯してから消す。振動が検出され続けている限りLEDも点灯し続ける。テキストは、ノイズの上限を上回ったときと下限を下回ったときとで点灯のパターンを分けているがここでは省いた。 #include <avr/io.h></avr/io.h>…

footstep detector / 背景ノイズの大きさを求める

今度は、中間電位の平均値だけでなく、同じ方法でノイズレベルの平均値も求める。 #include <avr/io.h> #include <util/delay.h> extern "C"{ #include "USART.h" } void initADC(){ ADMUX |= (1 << REFS0); // AVCCを基準電圧として使う。 ADCSRA |= (1 << ADPS2) | (1 << ADPS1) | </util/delay.h></avr/io.h>…

footstep detector / 中間電位からノイズを除去するための処理 / 実際に試してみる

平均値と素のAD変換値のどちらをシリアルから出力するかをタクトスイッチで切り換えられるようにした。Adruino IDEのシリアルプロッターで観測する。 #include <avr/io.h> #include <util/delay.h> extern "C"{ #include "USART.h" } void initADC(){ ADMUX |= (1 << REFS0); // AVCC</util/delay.h></avr/io.h>…

footstep detector / 中間電位からノイズを除去するための処理

pp.260-264 足踏みによる振動の大きさも、元々存在している振動も、センサーの感度もばらつきがある。加えて抵抗分圧器による中間電位も抵抗の精度によってばらつきが出る。こうした問題をすべてプログラミングで解決することにする。 感度を上げるためには…

footstep detector / とりあえずピエゾ素子をAVRにつないでAD変換だけしてみる

Arduino IDEのシリアルプロッターで観測した。 #include <avr/io.h> #include <util/delay.h> extern "C"{ #include "USART.h" } void initADC(){ ADMUX |= (1 << REFS0); // AVCCを基準電圧として使う。 ADCSRA |= (1 << ADPS2) | (1 << ADPS1) | (1 << ADPS0); // ADCプリスケーラ</util/delay.h></avr/io.h>…

ピエゾ素子、バイアス、保護回路

pp.255-258 ピエゾ素子を振動センサーとして使う。出力はプラマイ両方に振れるがマイコンのAD変換でマイナス側も拾いたいので出力を(電源電圧/2)の電位にバイアスする。ただしピエゾ素子自体がキャパシタの構造をしているのでDCカットの必要はない。 圧電ス…

AD変換 / 入力電圧のスケーリング、スリープモード、オーバーサンプリング

pp.245-254 0~15Vを簡易的に抵抗分圧で0~5Vにスケーリングし、それをAD変換する。併せてスリープモードのひとつであるADC Noise Reductionモードと16倍オーバーサンプリングとを試す。 AVRのADCは10ビット分解能なので16倍オーバーサンプリングによって12…

スリープモード(p.254、非公式訳)

AVRには、内部クロックの一部をスリープ状態にしておくさまざまなスリープモードがあります。何らかの割り込みが発生すればスリープから復帰します。使っていないハードウェアを任意のタイミングでシャットダウンしておいて、CPUでの処理が必要な割り込みや…

オーバーサンプリング(p.248、非公式訳)

オーバーサンプリングはまるで魔法です。10ビット分解能のセンサーを1個使って16回測定し、その総和を4で割ると12ビット分解能の測定結果が得られます。なぜでしょうか? 何回かサンプリングした値を普通に平均すれば、測定値に含まれるばらつきが小さくなり…

サーボの駆動 / パン・チルト機構にサーボを組み込んでジョイスティックで動かす

プログラムは前回とほぼ同じ。x軸は動きを逆にした。 #include <avr/io.h> #include <util/delay.h> #include "mylib.h" // パルス幅の範囲を決めておく。 #define PULSE_MID 1500 #define PULSE_RANGE_FULL 800 #define PULSE_RANGE_HALF (PULSE_RANGE_FULL / 2) #define PULSE_MIN </util/delay.h></avr/io.h>…

サーボの駆動 / ジョイスティックでサーボを制御する

ジョイスティックから出力される電圧値をAD変換し、それをパルス幅に変換する。 #include <avr/io.h> #include <util/delay.h> #include "mylib.h" // パルス幅の範囲を決めておく。 #define PULSE_MIN 1100 #define PULSE_MID 1500 #define PULSE_MAX 1900 // ジョイスティックの実</util/delay.h></avr/io.h>…

ジョイスティックの動作確認

測定結果はだいたい下のとおりであった。 x_minが254/1023、x_midが523/1023、x_maxが782/1023 y_minが244/1023、y_midが518/1023、y_maxが791/1023 #include <avr/io.h> #include <util/delay.h> extern "C"{ #include "USART.h" } void initADC(){ ADMUX |= (1 << REFS0); // AVCC</util/delay.h></avr/io.h>…

サーボの駆動 / シリアルポートからパルス幅を設定する

#include <avr/io.h> #include <util/delay.h> #include "mylib.h" extern "C"{ #include "USART.h" } #define PULSE_MIN 1200 #define PULSE_MID 1500 #define PULSE_MAX 1800 void initTimer1Servo(){ TCCR1A |= (1 << WGM11); TCCR1B |= (1 << WGM12) | (1 << WGM13); // 16ビット</util/delay.h></avr/io.h>…