転勤と、引越し等々があり、かなり更新がとまってしまった・・・
さて、ハーフマウスの足回りを再検討していて、なるべく市販品を使おうとしているのだけれど、モータマウントは自作するしかなさそうなので、設計中。
CADで作った図面が期待通りになっているかを確認するのに、dxfビューワを探して以下にたどり着いた。
Autodesk:
http://www.autodesk.co.jp/products/dwg/viewers#
本格的すぎて、少し重たいけれどautodeskなら安心・確実なので、使わせてもらう。
さて、図面を作っても加工できなければ意味がないので、加工機を買いたくてオリジナルマインドのサイトを久しぶりに訪れた。
買うとしたら 「KitMil Qt100」かなぁ。静音ボックスがあるのが嬉しい。だけれども、色々そろえると30万円くらいかかりそうなので、ちょっと悩む。
そして、京都にオリジナルマインドのKitMilQt100を使えるものづくりスペース・マテリアル京都ができたことを知る。京都なら1時間くらいで行けるので、自分でKitMil Qt100を買う前に何度か試してみようと思う。
マテリアル京都:
https://mtrl.net/kyoto/
マイクロマウスは、電気とソフトは面白いと思うのだけれど、機構に関しては苦手なので標準部品としてどこかのショップで販売してくれないかなと思う。
2015年8月27日木曜日
MPU6500 動く
3軸ジャイロ+3軸加速度センサMPU-6500をSTM32F4のSPI接続で動作確認をした。
・・・と書くと簡単に動いたみたいだけれど、かなり試行錯誤した。おもわず勢いでロジアナを買ってしまいたくなるくらい苦労した。
だけれど、オシロスコープだけで頑張った。
近いうちにAnalogDiscoveryを買いたいな。
さて、SPIの設定はこんな感じ。
MPU6500からのデータが正しく読めたかを確認するには、0x75番地のWHO_AM_Iレジスタを読み込めばよい。MPU6500の場合、その結果は0x70になる。
SPIの読み込みは、こんな感じ。
・・・と書くと簡単に動いたみたいだけれど、かなり試行錯誤した。おもわず勢いでロジアナを買ってしまいたくなるくらい苦労した。
だけれど、オシロスコープだけで頑張った。
近いうちにAnalogDiscoveryを買いたいな。
さて、SPIの設定はこんな感じ。
// SPI2 設定 SPI_InitTypeDef SPI_InitStructure; SPI_StructInit(&SPI_InitStructure); SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex; SPI_InitStructure.SPI_Mode = SPI_Mode_Master; SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b; SPI_InitStructure.SPI_CPOL = SPI_CPOL_High; SPI_InitStructure.SPI_CPHA = SPI_CPHA_2Edge; SPI_InitStructure.SPI_NSS = SPI_NSS_Soft; SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_256; SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB; SPI_Init(SPI2 , &SPI_InitStructure); SPI_Cmd(SPI2,ENABLE);
MPU6500からのデータが正しく読めたかを確認するには、0x75番地のWHO_AM_Iレジスタを読み込めばよい。MPU6500の場合、その結果は0x70になる。
SPIの読み込みは、こんな感じ。
/* MPU6500 リード */ uint16_t mpu6500_rd(SPI_TypeDef *SPIx , uint16_t reg){ volatile uint16_t ret=0; MPU6500_CS_ON(); while (SPI_I2S_GetFlagStatus(SPIx, SPI_I2S_FLAG_TXE) == RESET); // 送信バッファが空 SPI_I2S_SendData(SPIx,(reg|0x80)); while (SPI_I2S_GetFlagStatus(SPIx, SPI_I2S_FLAG_RXNE) == RESET); // 受信完了待ち ret = SPI_I2S_ReceiveData(SPIx); // dummy read SPI_I2S_SendData(SPIx,0xFF); // dummy write while (SPI_I2S_GetFlagStatus(SPIx, SPI_I2S_FLAG_RXNE) == RESET); // 受信完了待ち ret = SPI_I2S_ReceiveData(SPIx); MPU6500_CS_OFF(); return ret; }
2015年8月16日日曜日
ADC1とADC2とADC3
STM32F405とSTM32F407の64ピン版と100ピン版のADCについて一覧にしてみた。
ADC3が思いのほか、使えるチャンネルが少ない。
ADC3が思いのほか、使えるチャンネルが少ない。
ADC1 | ADC2 | ADC3 | |
ADC_ch0 | ○ | ○ | ○ |
ADC_ch1 | ○ | ○ | ○ |
ADC_ch2 | ○ | ○ | ○ |
ADC_ch3 | ○ | ○ | ○ |
ADC_ch4 | ○ | ○ | × |
ADC_ch5 | ○ | ○ | × |
ADC_ch6 | ○ | ○ | × |
ADC_ch7 | ○ | ○ | × |
ADC_ch8 | ○ | ○ | × |
ADC_ch9 | ○ | ○ | × |
ADC_ch10 | ○ | ○ | ○ |
ADC_ch11 | ○ | ○ | ○ |
ADC_ch12 | ○ | ○ | ○ |
ADC_ch13 | ○ | ○ | ○ |
ADC_ch14 | ○ | ○ | × |
ADC_ch15 | ○ | ○ | × |
2015年7月20日月曜日
STM32のクロック設定の自動生成
stm32f40xのクロックの設定は「system_stm32f4xx.c」で定義されている。
標準では、外部クロック8MHzが接続されている前提で168MHzで動作するように設定されている。
マウスでは、外部クロックではなく、内部クロック16MHzを使うので、設定を変更する必要がある。
これは普通にやると非常に面倒だ。
そこで、以下のページにあるエクセルファイルを使って自分の環境に即した「system_stm32f4xx.c」を生成する。エクセルのマクロを有効化してGenerateボタンで生成できる。
STSW-STM32091のページ
マウスの基板にマイコンを実装した。半田ブリッジがないことを目視で確認してから、電源-グランド間の抵抗値がおかしくないことを確認した。具体的には1MΩくらいあれば十分だと思う。
まだLEDを実装していないので、シリアルで通信できることが出来れば良しとする。
ちょっと反省は、プッシュスイッチと、電源用LEDが近すぎた。プログラム書き込みモードにするときに、プッシュスイッチを押しながらスライドスイッチをオンする必要があるのだけれど、プッシュスイッチを押す指でLEDが隠れてしまうのだ。それほど実害はないのだけれど、次回の課題とする。
もうひとつ。今は電源LEDの電流制限抵抗に2.2kΩを使っているのだけれど、まだ値が小さいようで少し明るい。明るいということは、電流を喰っているということなので、もう少し大きくしてもいいかもしれない。10kΩくらいかな?これは、適当にいらない基板で試してみればいいと思う。
電源周りで少し気になる点が。バッテリ駆動なので、電圧が少しずつ下がるのは仕方ないと思うけれど、レギュレータを通した後の電圧も、時間とともに低下するのだ。リポ電池の電圧は約3.8Vで、使って言うレギュレータは入出力間電圧は0.1Vの3.3V出力なので3.3Vは低下しないと思うのだけれど。
使っているレギュレータは秋月で購入したNJM2863F33。
確認したプログラムは以下。
2015年7月13日月曜日
電源部分の実装
ハーフマウス用の基板と部品がそろったので、そろそろ動き始める。
まずは、基板のショートチェック。
電源とグランド間がショートしていないかを、部品の未実装状態で確認する。
日本で作った基板の場合は、ほとんど必要のない作業だけれども、海外の安い基板メーカーで作った場合は自分でチェックしたほうが良い。
もしもショートしていたりしたら、電源つないだ途端に炎上しちゃうだろう。
それと、パターン切れの確認。
細いパターンを中心に行なう。これは目視で適当に。本当はランド間をテスタで導通チェックをしたらいい。
とりあえず、異常はなさそうなので、電源周りの部品を実装して、LEDが点灯するところまで進めた。
一歩でも前に。
まずは、基板のショートチェック。
電源とグランド間がショートしていないかを、部品の未実装状態で確認する。
日本で作った基板の場合は、ほとんど必要のない作業だけれども、海外の安い基板メーカーで作った場合は自分でチェックしたほうが良い。
もしもショートしていたりしたら、電源つないだ途端に炎上しちゃうだろう。
それと、パターン切れの確認。
細いパターンを中心に行なう。これは目視で適当に。本当はランド間をテスタで導通チェックをしたらいい。
とりあえず、異常はなさそうなので、電源周りの部品を実装して、LEDが点灯するところまで進めた。
一歩でも前に。
2015年7月8日水曜日
2015年6月27日土曜日
2015年6月23日火曜日
digi-keyに部品注文
ハーフマウスに使う電気部品をデジキーで注文した。
総額9000円。
デジキーは7500円以上は送料無料だけれど、1万円以上だと消費税がかかるので、ちょうどいい数量で頼むのが得策。
だけれども、1万円以下に抑えるために、注文を2回に分けたりするのはしない。そこは大人ですから(^^;
後は、デジモデで機構部品を依頼で1万円くらいの出費になりそう。
手持ち部品を使ったりもするけれど、総額3万円くらいでハーフサイズマウスが作れるということか。
総額9000円。
デジキーは7500円以上は送料無料だけれど、1万円以上だと消費税がかかるので、ちょうどいい数量で頼むのが得策。
だけれども、1万円以下に抑えるために、注文を2回に分けたりするのはしない。そこは大人ですから(^^;
後は、デジモデで機構部品を依頼で1万円くらいの出費になりそう。
手持ち部品を使ったりもするけれど、総額3万円くらいでハーフサイズマウスが作れるということか。
2015年6月21日日曜日
マウス基板を発注
FusionPCBにマイクロマウスハーフサイズ用の基板を注文した。
このペースだと今年の大会には間に合いそうにないけれど、何もしないよりはましだろう。
保存のためにガーバーデータをおいておく。
$46.06だったので、1$\128換算で約5900円(EMS送料込み)だった。
このペースだと今年の大会には間に合いそうにないけれど、何もしないよりはましだろう。
保存のためにガーバーデータをおいておく。
$46.06だったので、1$\128換算で約5900円(EMS送料込み)だった。
部品面
半田面
2015年6月7日日曜日
ソースコード変換のサイト
C言語のプログラムソースをWEBで公開するための、コード変換サイトを変えた。
前から”とか<>とかが きれいに変換できなかったから。
これまで使っていたサイト。
ソースを「そのまま表示する為のHTMLソース」に変換
今回使ってみたサイト。
WEB表示用、HTMLエンコード置換変換
より良いサイトがあれば、今後もホイホイ変えてしまうと思う。
前から”とか<>とかが きれいに変換できなかったから。
これまで使っていたサイト。
ソースを「そのまま表示する為のHTMLソース」に変換
今回使ってみたサイト。
WEB表示用、HTMLエンコード置換変換
より良いサイトがあれば、今後もホイホイ変えてしまうと思う。
MODXでRSS取得
自分のホームページと、このブログを連動させようとしてMODxでRSSを取得する方法を探していたけれど、古い情報ばかりで見つけられなかった。
目線を変えて、MODx関係なしに、普通の静的サイトでRSS情報の表示をどうしているのかを探してみて、次のサイトを見つけた。
K子の公式ブログ:簡単に出来る楽しいブログの作り方 第3回RSSの埋め込み方法
生成されたコードの内容を理解しようと思ったら大変だけれど、単に使うだけならばコードを貼り付けるだけなので簡単そうだ。
さっそく、チャンクで登録してテンプレートに追加してみた。
うん、いい感じ。
気づいてしまえば、それだけのことだったのに、MODxを使っているという先入観からRSS表示のアプローチを間違えてしまい、時間がかかった。
目線を変えて、MODx関係なしに、普通の静的サイトでRSS情報の表示をどうしているのかを探してみて、次のサイトを見つけた。
K子の公式ブログ:簡単に出来る楽しいブログの作り方 第3回RSSの埋め込み方法
生成されたコードの内容を理解しようと思ったら大変だけれど、単に使うだけならばコードを貼り付けるだけなので簡単そうだ。
さっそく、チャンクで登録してテンプレートに追加してみた。
うん、いい感じ。
気づいてしまえば、それだけのことだったのに、MODxを使っているという先入観からRSS表示のアプローチを間違えてしまい、時間がかかった。
2015年6月5日金曜日
STM32F4のADC3をDMA転送02
以前に書いた「STM32のAD変換01」では、AD変換した結果は右詰されていた。
しかし、その後に書いた記事、「STM32のAD変換結果をDMA転送」では、AD変換の結果が右詰されないで左詰で変数に格納されていた。
DMA関連の何かが悪いのだと思ったので、じっくり眺めたけれど分からなかった。
そこで、AD変換の初期化まわりを眺めなおしたら、少し気がついた。ADC_InitTypeDef構造体でADCを初期化する前に、ADC_StructInit関数を使って構造体自体の初期化をしているサンプルがある。それを真似して、ADC_StructInit関数で初期化してから構造体に値をセットして、ADC_Init関数で初期化してみた。
うまくいった。
なるほどね、構造体の初期値が不定だから、自分で設定しなかったメンバーが悪さをしていたのかな。だけれど、それだと、最初の「STM32のAD変換01」で期待通りの右詰で値を取得できた理由が分からない。
まぁ、とりあえず今はいいか。
それと、各種の関数の実体をソースで呼んでいるときに、ADC_DeInit関数の中身をみたらADC1のリセットをしているだけだったので、ADC3のリセット処理に変えてみた。
一度に色々と変更したせいで、どの変更がどう反映されたか分からなくなってしまったが、望んだ結果が得られたから、今日のところは良しとしよう。
ソースは以下。
2015年6月4日木曜日
STM32のTIM5でPWM出力
先日、TIM1でPWM出力が出来たので、TIM5でも楽勝と思っていたけれど、またまた上手くいかなかった。
結果としては、TIM5の設定は間違えてはおらず、GPIOの初期設定の間違えだった。
GPIOをオルタネート・ファンクションとして使う場合、GPIO_OTypeやGPIO_PuPdの設定は必要ないと思ったけれど、必要だった。
ごくごく初歩的な設定例だけれど、TIM5のPWM出力をする際のGPIO設定をさらします。
結果としては、TIM5の設定は間違えてはおらず、GPIOの初期設定の間違えだった。
GPIOをオルタネート・ファンクションとして使う場合、GPIO_OTypeやGPIO_PuPdの設定は必要ないと思ったけれど、必要だった。
ごくごく初歩的な設定例だけれど、TIM5のPWM出力をする際のGPIO設定をさらします。
// PA0,PA1,PA2,PA3 : GPIO_InitTypeDef GPIO_InitStructure; GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; GPIO_InitStructure.GPIO_Speed = GPIO_High_Speed; GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; // この行がないとPWM出力されない GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL; GPIO_Init(GPIOA,&GPIO_InitStructure);
2015年6月3日水曜日
STM32のAD変換スキャンモード不発
調子に乗って、AD変換のスキャンモードにチャレンジしてみたが、うまく結果を得られなかった。
//ADC3の変換モード設定。
ADC_InitStructure.ADC_Resolution = ADC_Resolution_12b;
// ↓ ENABLE(スキャンモード)、DISABLE(分割スキャンモード)
ADC_InitStructure.ADC_ScanConvMode = DISABLE;
// ↓ ENABLE(連続変換モード)、DISABLE(シングル変換モード)
ADC_InitStructure.ADC_ContinuousConvMode = ENABLE;
// ↓ AD変換開始トリガなし
ADC_InitStructure.ADC_ExternalTrigConvEdge = ADC_ExternalTrigConvEdge_None;
// ↓ AD変換後のデータ右詰
ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;
// ↓ 入力を4本(チャネルを増やしたらここを変える)
ADC_InitStructure.ADC_NbrOfConversion = 1;
ADC_Init(ADC3, &ADC_InitStructure);
変換モードをENABLEにしただけなんだけれど、駄目でした。
//ADC3の変換モード設定。
ADC_InitStructure.ADC_Resolution = ADC_Resolution_12b;
// ↓ ENABLE(スキャンモード)、DISABLE(分割スキャンモード)
ADC_InitStructure.ADC_ScanConvMode = DISABLE;
// ↓ ENABLE(連続変換モード)、DISABLE(シングル変換モード)
ADC_InitStructure.ADC_ContinuousConvMode = ENABLE;
// ↓ AD変換開始トリガなし
ADC_InitStructure.ADC_ExternalTrigConvEdge = ADC_ExternalTrigConvEdge_None;
// ↓ AD変換後のデータ右詰
ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;
// ↓ 入力を4本(チャネルを増やしたらここを変える)
ADC_InitStructure.ADC_NbrOfConversion = 1;
ADC_Init(ADC3, &ADC_InitStructure);
変換モードをENABLEにしただけなんだけれど、駄目でした。
2015年5月31日日曜日
STM32のAD変換01
今回からF4 discoveryではなくて、 自作F4基板でプログラムの評価をする。discoveryは周辺機能が盛りだくさんである一方で、使えるポートに制限があるので、ピッチ変換基板的な基板を作った。
詳しい話は、また別の機会に。
とりあえず、ポートの制限がなくなった。
さて本題。情報としては知っていたのだけれど、STM32のAD変換で、はまった。
STM32の12bitAD変換は変換結果を左詰にするか、右詰にするかを選べるのだけれど、右詰に設定しても、それが有効化されないのだ。
花岡ちゃんに花束を(STM32F4のAD変換トラブル(その2))
このページで、ADCの初期化でADC_DeInit();を実行すれば良いとされているが、それだけでは解決されなかった。
試行錯誤の結果、ADCの初期化処理の最後にウェイト処理を追加することで解決したので、ADCの初期化が完了する前に、ADCを使い始めてしまったのだろうか?
おそらく、データシートには書いてあるのだろうけれど、詳しく見てないので分からない。
ソースコードは以下。
詳しい話は、また別の機会に。
とりあえず、ポートの制限がなくなった。
さて本題。情報としては知っていたのだけれど、STM32のAD変換で、はまった。
STM32の12bitAD変換は変換結果を左詰にするか、右詰にするかを選べるのだけれど、右詰に設定しても、それが有効化されないのだ。
花岡ちゃんに花束を(STM32F4のAD変換トラブル(その2))
このページで、ADCの初期化でADC_DeInit();を実行すれば良いとされているが、それだけでは解決されなかった。
試行錯誤の結果、ADCの初期化処理の最後にウェイト処理を追加することで解決したので、ADCの初期化が完了する前に、ADCを使い始めてしまったのだろうか?
おそらく、データシートには書いてあるのだろうけれど、詳しく見てないので分からない。
ソースコードは以下。
2015年5月16日土曜日
STM32でモータ制御1
STM32F4でコアレスモータmk06を回してみた。
PB4、PB5にロータリーエンコーダを接続して、TIM3の位相計数でカウントしています。
モータはPE9、PE11に接続したモータドライバBD6211を介して行ないます。PE9、PE11はTIM1のPWM出力で動作します。
すんなりとはいかなかったところは以下。
1.符号なし変数から符号あり変数へのキャスト。
ロータリーエンコーダを使って、カウント動作させてみたのだけれど、STM32のレジスタは符号なしで定義されているので、負の値がそのまま使えない。
そこで、何も考えずにC言語の型のキャストを使ってみたのだけれど、うまくはいかなかった。
int16_t counter = (int16_t) TIM3->CNT;
これで、符号なし16bitデータを符号付16bitデータに出来たと思って、printfデバッグしてみた。
printf("counter : %d " , counter);
この値が、常に正の数で、デクリメントしても負の数にならない。0の下が65535になってしまう。
仕方ないので、最上位bitが1の時は、2の補数を取ることで、負の数にしている。
本当はもっときれいな方法があるのだろうけれど・・・。
2.TIM1(高機能タイマ)の動作
汎用タイマのTIM3などを使うときは必要ないのだけれど、高機能タイマのTIM1を出力で使用するときは、以下のコマンドが必要。
TIM_CtrlPWMOutputs(TIM1,ENABLE); // 高機能タイマ専用
詳しく追いかけていないけれど、必要だということで書いておく。
3.BD6211の制御論理
説明の前に、まずはモータドライバICのBD6211のデータシートを紹介(秋月リンク)。
このドライバを使ってPWM制御する際には、PWM制御モードAとPWM制御モードBというのがある。詳しいことはデータシートを見てほしいのだけれど、真理値表を見るとPWMで制御しないほうのピンをH固定するか、Lこてするかの違いに見えた。
その程度の違いなら、PWMモードAでいいかなと思い、ソフトのコーディングをした。
コンパイルエラーもなくしたところで、もう一度データシートを見ていたら、PWM制御モードAだと、PWM周期が20kHz以下だと途中でスタンバイモードになるため、理想どおりの制御にならないことがあると書かれている。
今回は、84kHz周期で使う予定なので、問題ないのだけれど、やはり気になるので、PWM制御モードBに変更した。
といっても、この段階では使っていないほうのピンをH固定からL固定にしただけ。
そして通電。
リセット直後は、信号を出していないのでモータは空転状態。そして、ロータリーエンコーダを一回まわすと、勢いよく回り始めた。なんだか全力で。これがコアレスモータの性能なのかと思いながらもロータリーエンコーダをまわし続けたら、次第にモータの元気がなくなってきた。
・・・あれ?
熱か電流でモータにダメージでも与えてしまったのかと思い、リセット。
気を取り直してエンコーダを回すと勢いよく回る。
ここで一呼吸おいて、よく考えてみたら当然のことだった。PWM制御モードをAからBに変更したときに、PWM制御してないほうの端子の論理を反転したのに、PWM信号自体はそのままだったので、最小幅のPWMで制御しているつもりが、最大幅になっていたのだ。すぐにTIM1のPWM出力の論理も反転することで、思ったとおりにゆっくりスタートのモータ制御が出来た。
ソースコードの表示は、以下をクリック。(書きなぐりでまとめてないので、汚いです。)
PB4、PB5にロータリーエンコーダを接続して、TIM3の位相計数でカウントしています。
モータはPE9、PE11に接続したモータドライバBD6211を介して行ないます。PE9、PE11はTIM1のPWM出力で動作します。
すんなりとはいかなかったところは以下。
1.符号なし変数から符号あり変数へのキャスト。
ロータリーエンコーダを使って、カウント動作させてみたのだけれど、STM32のレジスタは符号なしで定義されているので、負の値がそのまま使えない。
そこで、何も考えずにC言語の型のキャストを使ってみたのだけれど、うまくはいかなかった。
int16_t counter = (int16_t) TIM3->CNT;
これで、符号なし16bitデータを符号付16bitデータに出来たと思って、printfデバッグしてみた。
printf("counter : %d " , counter);
この値が、常に正の数で、デクリメントしても負の数にならない。0の下が65535になってしまう。
仕方ないので、最上位bitが1の時は、2の補数を取ることで、負の数にしている。
本当はもっときれいな方法があるのだろうけれど・・・。
2.TIM1(高機能タイマ)の動作
汎用タイマのTIM3などを使うときは必要ないのだけれど、高機能タイマのTIM1を出力で使用するときは、以下のコマンドが必要。
TIM_CtrlPWMOutputs(TIM1,ENABLE); // 高機能タイマ専用
詳しく追いかけていないけれど、必要だということで書いておく。
3.BD6211の制御論理
説明の前に、まずはモータドライバICのBD6211のデータシートを紹介(秋月リンク)。
このドライバを使ってPWM制御する際には、PWM制御モードAとPWM制御モードBというのがある。詳しいことはデータシートを見てほしいのだけれど、真理値表を見るとPWMで制御しないほうのピンをH固定するか、Lこてするかの違いに見えた。
その程度の違いなら、PWMモードAでいいかなと思い、ソフトのコーディングをした。
コンパイルエラーもなくしたところで、もう一度データシートを見ていたら、PWM制御モードAだと、PWM周期が20kHz以下だと途中でスタンバイモードになるため、理想どおりの制御にならないことがあると書かれている。
今回は、84kHz周期で使う予定なので、問題ないのだけれど、やはり気になるので、PWM制御モードBに変更した。
といっても、この段階では使っていないほうのピンをH固定からL固定にしただけ。
そして通電。
リセット直後は、信号を出していないのでモータは空転状態。そして、ロータリーエンコーダを一回まわすと、勢いよく回り始めた。なんだか全力で。これがコアレスモータの性能なのかと思いながらもロータリーエンコーダをまわし続けたら、次第にモータの元気がなくなってきた。
・・・あれ?
熱か電流でモータにダメージでも与えてしまったのかと思い、リセット。
気を取り直してエンコーダを回すと勢いよく回る。
ここで一呼吸おいて、よく考えてみたら当然のことだった。PWM制御モードをAからBに変更したときに、PWM制御してないほうの端子の論理を反転したのに、PWM信号自体はそのままだったので、最小幅のPWMで制御しているつもりが、最大幅になっていたのだ。すぐにTIM1のPWM出力の論理も反転することで、思ったとおりにゆっくりスタートのモータ制御が出来た。
ソースコードの表示は、以下をクリック。(書きなぐりでまとめてないので、汚いです。)
STM32F4 エンコーダ入力
秋月で売っている、このロータリーエンコーダーを使って、STM32のエンコーダー入力を試してみる。
参考にしたのは、以下のサイト。
・ロータリエンコーダによる角度検出
・Encoder Interfaceについて(ちょろまつ製作記)
以下は、STM32F4 discoveryで試したソース。
エンコーダの1クリックで、カウントが2つ変化するのは、B相の立上がりと立下りの両方でカウントしているのだろうか?ちょっとよく分からない。
ソースコードは以下。
STM32のSPI通信のエッジの設定
2月8日の記事にて、STM32のSPI通信のデータ取り込みエッジの設定を、
SPI_InitStructure.SPI_CPHA = SPI_CPHA_1Edge;
としていたが、これだと、送信データの8bit目が1のときに、タイムアウトみたいな変な動きをする。
そこで、以下のように変更したところ、まともに動くようになった。
SPI_InitStructure.SPI_CPHA = SPI_CPHA_2Edge;
時間を見つけて、きちんと波形で確認しないといけないと思った。
2015年2月8日日曜日
ubuntu 14.04にアップグレード
自宅サーバに使っているubuntuを14.04にアップグレードした。(いまさら・・・)
途中、各種の設定ファイルを新しいバージョンにするか、現在有効なのを使うかの選択を何回か聞かれた。
全部の設定をやり直すの面倒だったので、すべての質問で、現状維持と答えた。
それでアップグレードが終わって再起動したので、動作確認をした。
といっても、ファイルサーバとwwwサーバとしてしか使っていないので、やることは多くない。
まずは、Windowsからネットワークコンピュータ経由でサーバにアクセスして、ファイルが実行できることを確認。OK。
続いて、ブラウザ経由でwwwサーバの確認。NG。・・・あれ?
linuxは詳しくないので、なにをどうしていいのか分からないけれど、まずはエラーの確認をした。
sudo tail -F /var/log/apache2/error.log
すると、以下のようなエラーが発生している。
script '/var/www/html/index.html' not found or unable to stat
これまで、データは
/var/www
に置いていたのに、アクセスは
/var/www/html/
になってる。これはDocumentRootが書き換わっているに違いない。
それで、グーグル先生に聞いたところ、以下のサイトを紹介してくれた。
ITシロウトの備忘録(http://ubunturailsaaa.blogspot.jp/2014/01/apache2.html)
このサイトにある方法を参考に、DocumentRootを編集して、apache2を再起動して、wwwサーバへのアクセス成功を確認した。
途中、各種の設定ファイルを新しいバージョンにするか、現在有効なのを使うかの選択を何回か聞かれた。
全部の設定をやり直すの面倒だったので、すべての質問で、現状維持と答えた。
それでアップグレードが終わって再起動したので、動作確認をした。
といっても、ファイルサーバとwwwサーバとしてしか使っていないので、やることは多くない。
まずは、Windowsからネットワークコンピュータ経由でサーバにアクセスして、ファイルが実行できることを確認。OK。
続いて、ブラウザ経由でwwwサーバの確認。NG。・・・あれ?
linuxは詳しくないので、なにをどうしていいのか分からないけれど、まずはエラーの確認をした。
sudo tail -F /var/log/apache2/error.log
すると、以下のようなエラーが発生している。
script '/var/www/html/index.html' not found or unable to stat
これまで、データは
/var/www
に置いていたのに、アクセスは
/var/www/html/
になってる。これはDocumentRootが書き換わっているに違いない。
それで、グーグル先生に聞いたところ、以下のサイトを紹介してくれた。
ITシロウトの備忘録(http://ubunturailsaaa.blogspot.jp/2014/01/apache2.html)
このサイトにある方法を参考に、DocumentRootを編集して、apache2を再起動して、wwwサーバへのアクセス成功を確認した。
STM32F4 discoveryでSPI2通信
STM32F4 discoveryでSPI通信を試してみた。使ったのはSPI2。
通信相手は、microchip社のMCP23S17(IOエクスパンダ)。試したのはマイコンからの送信のみ。受信は後日。
SPI2を使うための手順は、以下。
main.cのほかに、mcp23s17.cとmcp23s17.hを作ってリンクする。
ソースコードは以下。
通信相手は、microchip社のMCP23S17(IOエクスパンダ)。試したのはマイコンからの送信のみ。受信は後日。
SPI2を使うための手順は、以下。
- GPIOのクロックを有効化
- GPIOの初期化
- SPI2のクロックを有効化
- SPI2の初期化
- SPI2が割当てられている端子をGPIO→AF使用に設定
- SPI2を有効化
main.cのほかに、mcp23s17.cとmcp23s17.hを作ってリンクする。
ソースコードは以下。
2015年2月7日土曜日
fritzingでブレッドボードイメージ
昔はユニバーサル基板に部品を半田付けをして、回路を作成していましたが、最近はブレッドボードを使うことが多い。
私の場合、ブレッドボードで回路を組むと、接続のイメージは頭の中で行うので紙とかで記録に残らないので後日もう一度同じ回路を組み直すのが難しい。
それに、ブログで公開するときに写真だと、見てくれる人も配線のイメージがしにくいと思うので、なにかいい方法がないかと思っていた。
それで、ネットで調べているとfritzingというソフトがオススメらしいので試してみた(latest version 0.9.1b)。
http://fritzing.org/home/
使い方は直感的に分かるので省略。
作った図面を画像データで保存するときに、ちょっと気になったのでメモ。
ファイル-> エクスポート->as Image->PNG
で、PNGファイルを生成できるが、以下のようにワイヤーの周りに不必要な点線が出来てしまう。
これを回避するために、ちょっと遠回りだけれど、以下のようにすると上手くいく。
まず、
ファイル-> エクスポート->as Image->SVG
で、SVGファイルを生成できる。SVGファイルがどういうものか、知らないけれど、取り合えずブラウザで開けるので、ブラウザ上で画像を名前をつけて保存すればPNG形式のファイルを取得できる。
このやり方を使えば、画像右下のfritzingというロゴも消えますね(残っていてもいいのだけれど)。
簡単ですが、今回はここまで。
私の場合、ブレッドボードで回路を組むと、接続のイメージは頭の中で行うので紙とかで記録に残らないので後日もう一度同じ回路を組み直すのが難しい。
それに、ブログで公開するときに写真だと、見てくれる人も配線のイメージがしにくいと思うので、なにかいい方法がないかと思っていた。
それで、ネットで調べているとfritzingというソフトがオススメらしいので試してみた(latest version 0.9.1b)。
http://fritzing.org/home/
使い方は直感的に分かるので省略。
作った図面を画像データで保存するときに、ちょっと気になったのでメモ。
ファイル-> エクスポート->as Image->PNG
で、PNGファイルを生成できるが、以下のようにワイヤーの周りに不必要な点線が出来てしまう。
これを回避するために、ちょっと遠回りだけれど、以下のようにすると上手くいく。
まず、
ファイル-> エクスポート->as Image->SVG
で、SVGファイルを生成できる。SVGファイルがどういうものか、知らないけれど、取り合えずブラウザで開けるので、ブラウザ上で画像を名前をつけて保存すればPNG形式のファイルを取得できる。
このやり方を使えば、画像右下のfritzingというロゴも消えますね(残っていてもいいのだけれど)。
簡単ですが、今回はここまで。
2015年1月17日土曜日
MODx
情報発信をする手段として、ブログは有用だとは思うけれど、やはり自分でサイトを立ち上げてホームページを公開したいというのも心の片隅にはある。
だけれども、いまさら静的なコンテンツページを作る気にも、管理する気にもなれないので、やはりCMSで作りたくなる。
だけれども、wordpressは重たいし、直感的に操作できないので好きではない。
それでいくつか探してみた。
探した結果、ModXに興味がでてきた。
公式ページ:http://modx.jp/
いきなり公開サーバで運用しないで、自宅サーバで試してみてから、と思ったのだけれどインストールではまった。もともとmodxの情報が少ないのだけれど、インストールで躓く人は少ないようでどうしていいのか分からなかった。
”データベース設定”という最初の画面で、必要な入力をして、”ここをクリックして、接続テストを行ってください。 ”、という箇所をクリックしても何の反応もしてくれないのだ。
だけれども、自宅サーバのapacheのエラーログを確認すると、
となっていて、ModXがどうこう言う前に、apacheの設定の問題のようだ。
Ubuntu版Apache2でmod_rewriteを有効にする
このページを参考に設定して再起動したところ、インストールを進めることが出来たので、今日は満足してしまった。
実際のインストールは、また後日。インストールしないかもだけど。
だけれども、いまさら静的なコンテンツページを作る気にも、管理する気にもなれないので、やはりCMSで作りたくなる。
だけれども、wordpressは重たいし、直感的に操作できないので好きではない。
それでいくつか探してみた。
探した結果、ModXに興味がでてきた。
公式ページ:http://modx.jp/
いきなり公開サーバで運用しないで、自宅サーバで試してみてから、と思ったのだけれどインストールではまった。もともとmodxの情報が少ないのだけれど、インストールで躓く人は少ないようでどうしていいのか分からなかった。
”データベース設定”という最初の画面で、必要な入力をして、”ここをクリックして、接続テストを行ってください。 ”、という箇所をクリックしても何の反応もしてくれないのだ。
だけれども、自宅サーバのapacheのエラーログを確認すると、
/var/www/modx/.htaccess: Invalid command 'RewriteEngine', perhaps misspelled or defined by a module not included in the server configuration
となっていて、ModXがどうこう言う前に、apacheの設定の問題のようだ。
Ubuntu版Apache2でmod_rewriteを有効にする
このページを参考に設定して再起動したところ、インストールを進めることが出来たので、今日は満足してしまった。
実際のインストールは、また後日。インストールしないかもだけど。
2015年1月10日土曜日
STM32F4 でシリアル通信(割込みあり)
前回に引き続き、STM32F4 discoveryのUART2を使って、パソコンにメッセージを表示させてみた。
今回は割込み使用。
uart2_printf(送信文字列)は、割込みなしで送信。
sci2_printf(送信文字列)は、リングバッファ経由で割込みありで送信。
共に、全角文字は駄目かなと思っていたけれど、ターミナルソフトの文字コードをSJISにしたら、全角文字も送れた。
プロジェクトは、こちら(stm32f4_uart02.zip)に保管します。
ソースコードは以下。
今回は割込み使用。
uart2_printf(送信文字列)は、割込みなしで送信。
sci2_printf(送信文字列)は、リングバッファ経由で割込みありで送信。
共に、全角文字は駄目かなと思っていたけれど、ターミナルソフトの文字コードをSJISにしたら、全角文字も送れた。
プロジェクトは、こちら(stm32f4_uart02.zip)に保管します。
ソースコードは以下。
2015年1月2日金曜日
STM32F4 でシリアル通信(割込みなし)
STM32F4 discoveryのUART2を使って、パソコンにメッセージを表示させてみた。
途中、sprintf()を使ったところで、_sbrkがないよというリンカエラーが発生した。
google先生に聞いたところ、通常はsyscalls.cで定義されている関数らしい。
syscalls.cはねむいさんのサンプルプロジェクトに同梱されていたので、使わせてもらう。
そのまま使うと、putch()とgetch()がないよと言われる。取り合えず今のところは標準入出力をそのま使わないので、syscalls.cの上のほうで中身のない、空の関数宣言してエラーを回避する。
UARTのような、特定機能(alternate function)を使う場合の手順は以下のようにする。
※ところで、今回alternate functionを特定機能と呼んだけれど、分かりやすい和訳は何だろう?直訳すると代替機能、ニュアンス的には周辺機能。プルチプレクサと同じことなんだろうけれど。
取り合えず動いたプロジェクトをこちら(stm32f4_uart01.zip)に保管します。
ソースコードは以下。
途中、sprintf()を使ったところで、_sbrkがないよというリンカエラーが発生した。
google先生に聞いたところ、通常はsyscalls.cで定義されている関数らしい。
syscalls.cはねむいさんのサンプルプロジェクトに同梱されていたので、使わせてもらう。
そのまま使うと、putch()とgetch()がないよと言われる。取り合えず今のところは標準入出力をそのま使わないので、syscalls.cの上のほうで中身のない、空の関数宣言してエラーを回避する。
UARTのような、特定機能(alternate function)を使う場合の手順は以下のようにする。
- 特定機能が割り当てられているGPIOのクロックを有効化する
- 特定機能のクロックを有効化する
- GPIOの設定をする(特定機能モードにする)
- 特定機能の設定をする
- デバイスの端子を特定機能に割り当てる
※ところで、今回alternate functionを特定機能と呼んだけれど、分かりやすい和訳は何だろう?直訳すると代替機能、ニュアンス的には周辺機能。プルチプレクサと同じことなんだろうけれど。
取り合えず動いたプロジェクトをこちら(stm32f4_uart01.zip)に保管します。
ソースコードは以下。
bloggerを便利に使う
このブログはbloggerを使ってます。
組み込み関係の内容を公開するには、いろいろと手を加えることで、見やすく使いやすく出来ます。
そのための、ノウハウページの紹介です。
・Blogger に Syntax Highlighter を導入する
ソースコードを表示するときに、デフォルトだと少し見づらかったり、表示が崩れるときがあります。そんなときは、SyntaxHighlighterが便利です。WordPressなんかの時にも使ってました。
上記サイトにしたがって設定をした後は、自分のページで表示したいコードの前後を
<pre class="brush:cpp">○○</pre>
のタグでくくればOKです。
・ソースを「そのまま表示する為のHTMLソース」に変換
ソースコードのタグ文字とかを変換してくれるサイト。
組み込み関係の内容を公開するには、いろいろと手を加えることで、見やすく使いやすく出来ます。
そのための、ノウハウページの紹介です。
・Blogger に Syntax Highlighter を導入する
ソースコードを表示するときに、デフォルトだと少し見づらかったり、表示が崩れるときがあります。そんなときは、SyntaxHighlighterが便利です。WordPressなんかの時にも使ってました。
上記サイトにしたがって設定をした後は、自分のページで表示したいコードの前後を
<pre class="brush:cpp">○○</pre>
のタグでくくればOKです。
・ソースを「そのまま表示する為のHTMLソース」に変換
ソースコードのタグ文字とかを変換してくれるサイト。
STM32F4 discovery 開発の参考サイト
STM32F4 discoveryを使った開発で参考になるサイトをまとめてみた。
公式ページ
STM32F4DISCOVERY
購入先(秋月電子)
開発環境の構築(ねむいさんのブログ)
CMSISについて
各種周辺機能
GPIO(入出力):GPIOについて
GPIO(入出力):花岡ちゃんに花束を
GPIO(入出力):STM32F4-DiscoveryでLチカやってみた
UART(シリアル通信):花岡ちゃんに花束を
UART(シリアル通信):STM32F4のUARTでprintf
UART(シリアル通信):STM32でUSARTを使ってみる
とりま以上。随時増やしていきます。
公式ページ
STM32F4DISCOVERY
購入先(秋月電子)
開発環境の構築(ねむいさんのブログ)
CMSISについて
各種周辺機能
GPIO(入出力):GPIOについて
GPIO(入出力):花岡ちゃんに花束を
GPIO(入出力):STM32F4-DiscoveryでLチカやってみた
UART(シリアル通信):花岡ちゃんに花束を
UART(シリアル通信):STM32F4のUARTでprintf
UART(シリアル通信):STM32でUSARTを使ってみる
とりま以上。随時増やしていきます。
登録:
投稿 (Atom)