写真を直線画にするツール

Merry Xmas

どうもこんばんは、15-nomoです。

こちらはrogy Advent Calendar 2018の25日目、最後の記事になります。

 

本当はいま自作している自分のblogで公開したかったのですが、間に合わなくてrogiken blogに投稿します。 自作blogについてはまた今度。

また、記事も最近作っている三輪オムニボールについて書こうと思ったのですが、回路にミスがあったのでこちらもまた今度にします。

ということで今回はLinePictureという作品について書きたいと思います。

“写真を直線画にするツール” の続きを読む

Maquinistaの2018年を振り返る

こんにちは。Maquinistaで広報を担当している16のMassaです。

こちらはrogy Advent Calendar 2018の23日目の記事になります。

Maquinistaでは来年5月26日に開催されるNHK学生ロボコン2019に向けて日々活動しています。特に現在は1次ビデオ審査を目前に控えているため、練習や調整を行っています。
“Maquinistaの2018年を振り返る” の続きを読む

STM32でマウスとキーボードを作る

こんにちは。18のHitomosiです。この記事は [rogy Advent Calendar 2018]の20日目の記事です。

マウスとかキーボードが作れるってよくないですか?PCに接続するだけで動くだけでも正直面白いんですが、作ったものでPCが操作できます!

マウスとかキーボードを作るといっても、今回はいわゆるそういうものを作るというわけではなくて、USBでPCに接続するとマウスやらキーボードとして使える何かみたいなものを作ります。要するにHIDデバイスを作るわけですね。ヒューマンインタフェースデバイスデバイス。

今回はボタン入力のものを作っていきますが、様々なセンサーの値を反映させるみたいなこともできるので、いろいろ応用が利くかと思います。

最低限必要な部品

  • STM32のうち、USBが使えるもの
    今回は、F042K6T6を使います。このマイコンは秋月で250円で売っているうえにUSB通信に水晶発振子がいらないのがメリットです。逆に言うとこれ以外のSTM32を使う場合は通信に必要な48MHzを得るために水晶発振子が必要です。STM32はPLLを内蔵しているので、12MHzあたりの水晶発振子を用意すればいいかと思います。
  •  3.3Vレギュレータ
    STM32は電源としてUSBのVBUSの5Vを使うと死ぬので用意しましょう。
  •  USBコネクタ
    今回はUSBで接続するので必要です。

回路図

ポリスイッチはDIP化キットについていたものなんですが、たぶんあったほうがいいです。
余っているIOポートにスイッチとかLEDとかセンサとかを付けます。今回はそういう基板があったのでPA8にスイッチを付けていますが、別に何でもいいです。
JTAGは書き込みとデバッグに使っているだけなのでSTLinkとかでもいいです。

今回の環境

種類 環境
マイコン STM32F042K6T6
OS Windows10
IDE Atollic TrueSTUDIO 9.0.1
コードジェネレーター STM32CubeMX
デバッガ SEGGER J-Link EDU Mini

CubeMXの設定

Pinout

Peripherals

  •  SYS
    今回はSWDで書き込むので以下のようにします。
  • USB
    以下のように設定します。
  • RCC
    以下のように設定します。
  • TIM14
    タイマ割り込みを使うのでActivateしておきます。

    MiddleWares
  • USB_DEVICE
    以下のように設定します。

あとはPA8をGPIO_Inputにしておしまいです。

こんな感じになります。

Clock configuration

Pinoutの設定をしてから開くと以下のようなダイアログが出てくるかと思うのでYesを押します。自動でエラーが起こらないように設定を変えてくれます。

エラーが起こらないようになのでメインのクロックなどが変な値になっていることがあります。そうなっていたら修正したい箇所をいじってからAlt+Fを押すともう一度自動修正してくれます。

Configration

まずは、PA8をプルアップしておきます。
GPIOの設定からできます。

TIM14の設定をします。
今回は1msごとにタイマ割り込みをしようと考えてるので、こんな感じに設定します。

割り込み許可をしておきます。

終わったら、Project→Generate CodeからIDEとしてTrueStudioを選択してOKを押します。

TruestudioのProjectが生成されるので、そのProjectを開きます。

TrueStudioでの操作

自動で生成されているSrc/main.cを開き、

タイマ割り込みをするため、/USER CODE BEGIN X/と/USER CODE END X/(Xには数字とかが入る)に以下のようなコードを書きます


/* USER CODE BEGIN PV */
/* Private variables ---------------------------------------------------------*/
static volatile uint8_t interrupt;
/* USER CODE END PV */

/* USER CODE BEGIN 0 */
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim) {
if (htim->Instance == TIM14) {
interrupt = 1;
}
}
/* USER CODE END 0 */

/* USER CODE BEGIN 1 */
interrupt = 0
/* USER CODE END 1 */

/* USER CODE BEGIN 2 */
HAL_TIM_Base_Start_IT(&htim14);
/* USER CODE END 2 */

ここからはマウスとキーボードで違います。
https://notes.iopush.net/stm32-custom-usb-hid-step-by-step-2/
https://damogranlabs.com/2018/02/stm32-usb-hid-mouse-keyboard/
をめちゃくちゃ参考にしているので分からなかったらそっちを見たほうが早いかもしれません。

マウス

ライブラリを読み込んだ時点でだいたい設定が終わっているのでほとんど操作はいりません。
今回はボタンを押したら(押している間)カーソルが右に動くやつを作っていきます。


/* USER CODE BEGIN 1 */
interrupt = 0;
struct mouseHID_t {
uint8_t buttons;
int8_t x;
int8_t y;
int8_t wheel;
};
struct mouseHID_t mouseHID;
mouseHID.buttons = 0;
mouseHID.x = 0;
mouseHID.y = 0;
mouseHID.wheel = 0;
/* USER CODE END 1 */

こんな感じで構造体を定義しておきます。
https://notes.iopush.net/stm32-custom-usb-hid-step-by-step-2/からの引用です。
この構造体に値を入れて、


USBD_HID_SendReport(&hUsbDeviceFS, &mouseHID, sizeof(struct mouseHID_t));

という関数を呼び出すと値が送られます。
じゃあどれにどんな値を入れるとどうなるんだという話なんですが、

  •  mouseHID.buttons
    ボタンの状態をビット単位で入力します。
    1になっていると押している扱いになります。
7 6 5 4 3 2 1 0
ホイールクリック 右クリック 左クリック

要するに、


mouseHID.buttons = 0b001; //左クリック
USBD_HID_SendReport(&hUsbDeviceFS, &mouseHID, sizeof(struct mouseHID_t));

と書くと左クリックしていることになります。

  • mouseHID.x , mouseHID.y
    これの値の相対座標の位置にカーソルが移動します。ベクトル的な感じです。int8_t(-127~127)の範囲であることに注意。
  • mouseHID.wheel
    正の値が入っていると、上方向にスクロールします。負の値だと逆です。やたらすごい速度が出ます。

あとはこんな感じに書いてあげればボタンを押している間カーソルが右に動いてくれるかと思います。


/* USER CODE BEGIN WHILE */
while (1)
{
while(interrupt == 0);
interrupt = 0;
if(HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_0) == 0){
mouseHID.x = 5;
}
USBD_HID_SendReport(&hUsbDeviceFS, &mouseHID, sizeof(struct mouseHID_t));
mouseHID.x = 0;
/* USER CODE END WHILE */

本来USBD_HID_SendReportの2つ目の引数にはuint8_tのものを入れないといけないんですが、int8_tを入れてしまっています。受け取った側がint8_tとして解釈するんですよね……動くのでおそらく大丈夫です。

 キーボード

キーボードはライブラリをいろいろ書き換えなきゃいけません。ここで注意なんですが、CubeMXでコードを再生成するとライブラリも再生成されます
要するにいじったところが全部戻されてしまうので注意してください。私は解決法が見つからなかったためライブラリを/Srcに避難させたうえで再生成されたものを消しています。解決法を知っている方がいたら教えていただきたいです。
ライブラリのうち書き換えないといけない部分はMiddlewares/ST/STM32_USB_Device_Library/Class/HIDの/Inc/usbd_hid.hと/Src/usbd_hid.cです。

usbd_hid.c

レポートディスクリプタを書き換えます。
HID_MOUSE_ReportDesc[HID_MOUSE_REPORT_DESC_SIZE]を、


__ALIGN_BEGIN static uint8_t HID_MOUSE_ReportDesc[HID_MOUSE_REPORT_DESC_SIZE] __ALIGN_END ={
//45 bytes
0x05, 0x01, // USAGE_PAGE (Generic Desktop)
0x09, 0x06, // USAGE (Keyboard)
0xa1, 0x01, // COLLECTION (Application)
0x05, 0x07, // USAGE_PAGE (Keyboard)
0x19, 0xe0, // USAGE_MINIMUM (Keyboard LeftControl)
0x29, 0xe7, // USAGE_MAXIMUM (Keyboard Right GUI)
0x15, 0x00, // LOGICAL_MINIMUM (0)
0x25, 0x01, // LOGICAL_MAXIMUM (1)
0x75, 0x01, // REPORT_SIZE (1)
0x95, 0x08, // REPORT_COUNT (8)
0x81, 0x02, // INPUT (Data,Var,Abs) //1 byte

0x95, 0x01, // REPORT_COUNT (1)
0x75, 0x08, // REPORT_SIZE (8)
0x81, 0x03, // INPUT (Cnst,Var,Abs) //1 byte

0x95, 0x06, // REPORT_COUNT (6)
0x75, 0x08, // REPORT_SIZE (8)
0x15, 0x00, // LOGICAL_MINIMUM (0)
0x25, 0x65, // LOGICAL_MAXIMUM (101)
0x05, 0x07, // USAGE_PAGE (Keyboard)
0x19, 0x00, // USAGE_MINIMUM (Reserved (no event indicated))
0x29, 0x65, // USAGE_MAXIMUM (Keyboard Application)
0x81, 0x00, // INPUT (Data,Ary,Abs) //6 bytes

0xc0 // END_COLLECTION
};

のように書き換えます。
https://damogranlabs.com/2018/02/stm32-usb-hid-mouse-keyboard/ から引用したものです。
キーボードなのにHID_MOUSE_ReportDescじゃ気持ち悪いと言われたらそうなんですが、ちょっと大変なので今回はそのまま使います。
次に、USBD_HID_CfgDescを書き換えます。 nInterfaceProtocolを1(keyboard)としてください。

usbd_hid.h

HID_EPIN_SIZEを0x08にしてください。 HID_MOUSE_REPORT_DESC_SIZEをレポートディスクリプタのbyte数と同じ値(今回は45)にしてください。
これで書き換えはおしまいです。

main.c


/* USER CODE BEGIN 1 */
interrupt = 0;
struct keyboardHID_t {
uint8_t modifiers;
uint8_t reserved;
uint8_t key[6];
};
struct keyboardHID_t keyboardHID;
keyboardHID.modifiers = 0;
keyboardHID.reserved = 0;
for(int i = 0 ;i < 6; i++){
keyboardHID.key[i] = 0;
}
/* USER CODE END 1 */

今度はこんな感じの構造体を定義します。
今回は分かりやすいですが、各変数について説明すると以下のようになります。

  • modifiers
    修飾キーの動作をビット単位で入力します。1にしていると押してることになります。
    GUIはWindowsだとWin、MacだとCommandになります。
7 6 5 4 3 2 1 0
右GUI 右Alt 右Shift 右Ctrl 左GUI 左Alt 左Shift 左Ctrl
  • reserved
    予約されている部分です。要するに使いません。
  • key[6]
    キーコードが6つまで入れられる配列です。
    キーに割り当てられているコードを入れると押していることになります。つまり、通常のキーの同時押しは6つが限界です。
    キーコードは以下のサイトを参考にするといいです。
    http://www2d.biglobe.ne.jp/~msyk/keyboard/layout/usbkeycode.html
    Usage IDがコードになります。Aだったら0x04といった具合です。

あとはこんな具合に書けば、ボタンを押すごとにasdfghが表示されるかと思います。


/* USER CODE BEGIN WHILE */
while (1)
{
while(interrupt == 0);
interrupt = 0;
if(HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_8) == 0){
keyboardHID.key[0] = 0x04; //a
keyboardHID.key[1] = 0x16; //s
keyboardHID.key[2] = 0x07; //d
keyboardHID.key[3] = 0x09; //f
keyboardHID.key[4] = 0x0A; //g
keyboardHID.key[5] = 0x0B; //h
}
USBD_HID_SendReport(&hUsbDeviceFS, &keyboardHID, sizeof(struct keyboardHID_t));
for(int i = 0 ;i < 6; i++){
keyboardHID.key[i] = 0;
}
/* USER CODE END WHILE */

これでキーボードも完成です。

まとめ

マウスとキーボード(という名の1ボタンの何か)ができました。ハードと操作するソフトウェアの組み合わせで様々なことができるので、ぜひ作ってみてください!

ロリノススメ

初めまして、17のバンル( @17_bnr )です。

この記事はrogy Advent Calendar 2018の17日目になってます。

さて、みなさんロリは好きですか? 僕は好きです。

ロリとはもちろんエレクトニクスとエレクトシティを勉強・研究するところ、つまり工学院電気電子系です!!

 

電気電子系では主に5分野について研究しています。

このページを見てもらうと5分野が詳細にわかると思いますが、ざっくりいうと

回路:いろんな素子を使っていろんなものを作る研究

波動・光および通信:電磁波の利用の仕方を研究

デバイス:新しい電子部品の研究

材料・物性:新しい物性を持つ材料の開発、利用の研究

電力・エネルギー:電気エネルギーとほかのエネルギーの変換を研究

 

ということで、

可視光で抵抗値が変わる材料を用いた可視光通信による、スイッチング電子デバイスより電力機器を動かす回路を作りました。

 

回路図です。

動作の流れとしては4.5Vで流れるLEDが光るとフォトICの抵抗が下がるので、R1にかかる電圧が上がるので、FETのゲートがONになります。

そうすると無安定バイブレーターが作動し、電流が交互にAIN1とAIN2に入ります。

最後に、モータードライバーに信号が入り、モーターが動きます。

 

ということで動かした動画です。

容量の関係で短い動画しかアップロードできませんでしたが長めの動画はツイッターにあげたいと思います。

そろそろ系所属が始まると思うのでぜひロリ系へ

AdCなのでADCを作った

こんにちは16のマッキーです。
この記事はrogy Advent Calendar 2018の15日の記事です。

タイトルの通りですが、AdC(Advent Calendar)ということでADC(Analog Digital Converter)を作ってみました。

ADCはマイコンとかを使う人はおなじみの機能だったりすると思うのですが、それを使うのではなく自分で作ろうといったところです。

そんな感じで作ったものを紹介します。

 

ADCの概要についてはここ → https://www.rohm.co.jp/electronics-basics/ad-converters/ad_what1 などを見ると以下の説明もだいたいわかると思います。

今回はフラッシュ型と逐次比較型のADCを作りました。とりあえず動作すればいいかなということで性能は特に気にして作ってませんが、最終的にAD変換したものをLEDにレベルメーターのように出力できればいいかなと思ったのでどちらも5bitのADCにしました。

フラッシュ型


回路自体もコンパレータを大量に並べただけなのでシンプルでいい感じですね。

逐次比較型


本当はサンプルホールド回路が入るのですが、時間が足りなかったのでついてません。ただ人がLEDのメーターを見る分には問題なさそうです。(動画は1Hzの三角波)

二分探索してる様子です。青い信号(DACの出力)が少しずつ黄色い入力電圧に近づいてます。

比較部分のロジックはFPGAを使いました。
またそのためのHDLのコードをMATLABのHDL Coderというツールを使ってみました。このため、コードは書かずにブロックをごちゃごちゃいじってHDLを生成できました。

↑Simulink上の回路の雰囲気

FPAG周りの回路はユニバーサル基板上に作りました。(こんな感じの配線は初めてやったけど意外とできることが分かった)

まとめ

  • AdCでADC作ったっていうのができてよかった(これが一番やりたかった)
  • AD変換ができたっぽかったのでよかった
  • なんかFPGA使いたかったので使えてよかった
  • MATLAB最高だった
  • はんだ付け楽しかった
  • 他の変換方式もやろうと思ってたけど時間が足りなくて悲しかった

 

 

タイヤが丸くないラジコンカーが作りたい!

この記事はrogy Advent Calendar 2018 13日目の記事です.

こんちゃーっす
修論の進捗が厳しいおにぎりです.

とりあえず修論から現実逃避して,楽しくものつくりしながらブログ書いてます.

さて今回は,一昨年の非円形歯車,去年の双葉車に続いて特殊歯車シリーズ第3弾です.
もしお時間があればそちらもどうぞ合わせてご覧くださいませ

※注意
ダラダラ書いてしまったので結構長くなってしまいました.
途中に出てくる数式たちについては流し読み推奨です.

1. つくったもの


言ってしまえば,今まで僕はいわゆる “ただの歯車そのもの” を作って回して遊んでいただけでした.
そこで,歯車自体をおもちゃにするのではなく,特殊歯車を使った,まだ誰も作っていないおもちゃを作りたい.そう思ったわけです.

ということで,モーターを使って最も簡単に作れるおもちゃの1つである,ラジコンカーに焦点をあてます.
普通のラジコンカーではつまらない.そこで,僕の思想は

タイヤが丸くなければ面白そう!

でも乗り心地やラジコンとしての操作性は落としたくない!

この問題,1組の歯車で解決できるのでは!!!!!!

ハイ.いつもどおり突拍子がないですね.

何はともあれ作ったものがこちらです.

いかがでしょうか?タイヤが楕円であることを除けば,ほぼ普通のラジコンカーです.
もちろんマイコンは一切使っていませんし,モーターも左右合わせて2個だけです.
察しのいい方は,何やら赤い歯車と青い歯車が重要そうだと睨んでいることと思います.

さて,では具体的にどんな仕組みなんでしょうか?

答え合わせと設計手法は次のページ!

CODE THANKS FESTIVAL 2018 参加記

この記事は rogy Advent Calendar 2018 4日目の記事です。

やまだです。

先日行われたCODE THANKS FESTIVAL 2018に参加しました。

CODE FESTIVALとは、主に大学生を対象にしたプログラミングコンテスト(いわゆる競技プログラミング)です。詳細は https://www.recruit-jinji.jp/recruitment/code_fes/ とかを見てください。

わりと参加者の方々が参加記を書いているっぽいので、僕も書いてみます。特別おもしろい話はないです。

当日の朝

起床に大成功しました。大成功というのは、起床予定時刻よりも早く起きたという意味です。

余裕を持って電車に乗りました。乗り換えは大変難易度が高く、困難を極めました。

なんとか会場最寄り駅についたのですが、会場への道がわかりません。

そこで、「自分と同じオーラを感じる人」を発見したのでこっそりついていくと無事会場へたどり着きました。その方も参加者だったようです。きっと、こうやって会場にたどり着くような能力のことを社会性というのだろう、と思いました。

コンテスト

直前にモンスターエナジーを飲んだら気持ち悪くなりました。アホですね。

コンテスト問題の考察等は他の人が散々やってると思うので特にここには書きません。一応自分の提出履歴を貼っておきますが、多分見ても面白くないと思います。

提出履歴

ちょっとだけコンテスト中のことを話すと、B問題を雰囲気で解いたら4回も誤答しました。

F問題については、通らないと思ってたら意外とテストケースが通って、よくわからないけど適当にif文を1つねじこんだら通りました。今でもなぜこのif文を追加したら通ったのかよく分かっていません。

順位は100人中15位でした。思ってたより高くて嬉しかったです。

懇親会

懇親会があったのですが、身内が多かったのでそこで固まってしまいました。こういうところに社会性のなさを感じますね。

そういえば朝知らない人に挨拶されたんですが、このときに実はロ技研の後輩だったことがわかりました。気づかなくてごめんね。

感想など

  • あの有名なAtCoderの社長さんに初めて出会いました。AtCoder社のシールをいただきました。嬉しい。
  • 同じ大学の1年生の人々がとても優秀でした。今後きっと強くなってくれるでしょう。内心怖くて怯えています。

全体的にとても楽しかったです。パーカー等も貰えたので所持する衣類が少ない僕にとってはとても嬉しいです。関係者の方々ありがとうございました。

以上です。

最高の言語Python

注意 : この記事は半分ネタで書かれています。ご了承ください。

この記事は rogy Advent Calendar 2018 2日目の記事です。

みなさんこんにちは、やまだです。

もうすぐクリスマスですね、いかがお過ごしですか?

クリスマスを一緒に過ごす人はできましたか?ぼくはできませんでした。悲しいね。

恋人がいないならペットなんてどうでしょうか。一風変わったペットに蛇なんて面白いかもしれませんね。

ということでPythonについて書きます。Pythonはいいぞ。

型アノテーションをつけられる

型アノテーションがつけられるって知ってましたか?

あまりにわざとらしい例ですが、こんな感じ。ちなにみ言語側に型チェック機能はないらしいです。現時点ではコメントと同等の機能しかないらしい(ちゃんと調べてないですが……)。

こんなモジュールがあったり、多少静的なチェックをしてくれるIDEとかあるらしいです。これはもう実質静的型付け言語ですね(いいえ)。

ライブラリが充実している

いろんなライブラリがあります、すごいね。

TensorFlowを使えば深層学習ができるし、 Djangoを使えばwebもできる!!

これはもうフルスタックエンジニア間違いなしですね!!

グラフとかもスッと描画できたりします。各点のx座標、y座標をそれぞれlistにぶち込むだけでそれっぽいものができたり。

しかしデータ量が多いと遅すぎてお話にならないので、Rとかgnuplotとかの使用をおすすめします。

環境構築が簡単

環境構築が難しいのなんて昔の話、今は Anacondaとか使えば、ライブラリ含め簡単に環境構築ができます、多分。

これは初学者にも優しいですね。そもそもWindowsを使わなければ環境構築に苦しむことはあまりないはずですが。

シェルコマンドを呼び出せる

例えば、こんな「邪悪な」コードも実行できます(実行する際は自己責任で)

冗談はさておき(この記事自体が冗談みたいなものなんですが)、例えばディレクトリの操作をしたいけどシェルスクリプトを書くのがツラいときなど、意外と便利だったりします。

これはまた別の話ですが、他の言語で書かれたソースコードのコンパイル・実行が可能です。

つまり実質任意の言語が書けるってことです。よかったですね。なにが嬉しいのかはよくわかりませんが。

最後に

この記事の執筆者はPythonが嫌いです。

ですがこのように「素晴らしい」機能がたくさんあるので、ぜひ皆さんにも使ってみてほしいです!!

次生まれるときにはもっとまともな記事が書ける人生を歩みたいと思いました。各位ごめんなさい。

それではみなさん、良いクリスマスを!!

第一回プチコン

こんばんは、15のもです。
この記事はrogy Advent Calendar 23日目の記事です。
遅くなりましたがプチコンの報告をします。

プチコンとは

プチコンとは冬にもロ技研としてロボコンしたいなと思ったので今年から開催している大会です。
大会は移動ロボット部門と、マイクロマウス部門(クラシック&ハーフ)が行われました。

この大会ではElephantechさんがスポンサーとしてラズパイやPINE64などの副賞を用意してくださいました。
ありがとうございました。 “第一回プチコン” の続きを読む