[techaday:0001] C言語での符号とビットシフトについて

[techaday:0001] C言語での符号とビットシフトについて

はじめに

「1日1技シリーズ(別名techadayも併用することにします)」記念すべき第1回は,整数型の符号とビットシフトに関する話題です. ビット演算は特にマイコンプログラミング等において,IOを使用するためだけでなく高速化やメモリ節約のためにも頻繁に使用されます. 今回と次回はそんなビット演算について,知らないとハマりやすいポイントについて書いていきます.

前提知識

  • C言語の基礎的文法がわかる
  • ビット演算についてイメージできる

効能

  • signed な整数型変数と unsigned な整数型変数でのビットシフトの処理の違いがわかる
  • 異なる処理をわざわざ行う理由が分かる
  • unsigned char と書くべきところをうっかり char と書いて闇に落ちてしまうのを防止できるようになる

Read More

Share Comments

第36回全日本マイクロマウス大会に参加してきた

第36回全日本マイクロマウス大会に参加してきた

結果は11位でした

11/21,22日に開催された全日本マイクロマウス大会に参加してきました. この大会に向けた目標として「クラシック競技エキスパートクラスで10位以内を取る」,というのがあったのですが,今年は達成ならずでした. もっとも,海外勢の存在を忘れていた状態でこのような目標を設定したので,台湾やシンガポールからのマウスを見て諦めがつくとともに,実力不足を実感した次第です.

マウスのスペック等についてはもう少ししてから書くことにします.

結果

NTFのページに結果が出ています

個人的には探索含めて不安ばかりだったので,ひたすら Cobaltの人 と我慢大会をしていました. 詳細な結果は以下のとおりです.

走行 モード タイム
第1走 0:40:34 探索(パラメータ:3/4)
第2走 0:10:75 最短(パラメータ:2/7)
第3走 R 最短(パラメータ:4/7)
第4走 R 最短(パラメータ:5/7)
第5走 R 最短(パラメータ:3/7)

動画(3:53:00付近から 毎度記録・配信をしてくださっているNVS様に感謝!):

第1走の探索では,後述する不具合のせいでかなり壁にこすりながら走行しており(それでも壁情報は1箇所しか壊れていないと思います),確実な情報しか最短走行の経路選択に使用しないアルゴリズムにしている私にとっては,きちんと帰ってくるか帰ってこないかが明暗を分けるような綱渡りの状況でした. 危うさを見せながらも運良くゴール後にスタートまで帰ってきてくれたのでほっとしました.

反省点

  • 第1走の際の合図を忘れる
    後で思い出したのですが,学生大会でもやらかしてました.慌てるのヨクナイ… 計測がおかしかったのもたぶんそれのせいです.ごめんなさい.
  • 壁制御の構造の複雑化に伴うバグ
    ひたすら壁に吸い付いていくような挙動が特定の条件で発動するようなバグがありました(朝に気づいたものの修正できず).
  • 直前にタイヤを履き替えない🙅
    グリップが良くなるので高速走行時のターンは滑りにくくなるのですが,4輪マウスの特徴上タイヤがある程度削れて程よい接地具合になるまでは超信地旋回や走行中のターンで回転中心がズレてしまいます.タイヤ径のパラメータも微妙に変わるせいで,ほかにもよくわからない部分がいろいろとズレます.
  • 斜め走行をしようという割にマシンの幅が少し大きすぎた 78 mm 程度の幅なのですが,74 mm あたりがよくある1717使用のマウスのようです.でも一応斜め走行は可能でした.

最後に

応援に駆けつけてくださった方々,どうもありがとうございました. 大会中,様々なアドバイスや技術的な交流をしていただいた 東京理科大学 Mice の皆さんや,電気通信大学ロボメカ工房 の皆さんに特に御礼いたします. 大会運営にあたってご尽力くださったたくさんの方々に敬意を表するとともに,来年以降も参加者としてぜひ盛り上げていきたいと考えている次第です. 関係者の皆様,本当におつかれさまでした.

おまけを載せました.↓からどうぞ

Read More

Share Comments

1日1技シリーズ開始

1日1技シリーズ開始

何なのさ

自分の持っている知識・思考の整理と,知らないとハマりそうなポイントの共有という目的で 1人 Advent Calendar 的なものをやってみようと思います. なるべく1日1トピック,知ってる人にとっては当たり前っぽいテーマで書いていきます.

個人的な目標として,1記事あたり30分以内(できれば15分以内)に書き上げるのをルールにしたいと思います. 要はそれぐらいシンプルに,ミニマムな構成の技術ネタを大量に投げていく予定です. 間違いや質問・リクエストなどがあれば,私や読者の後学にもなりますのでぜひコメントを残していってください.追える範囲でフォローアップします.

内容について

主にこんな感じでしょうか

  • コンピュータ関連
    • プログラミング (C, C++, MATLAB あたりがメイン?)
    • ツール,環境 (Linuxメイン)
  • 工学的数学
  • 剛体力学
  • 電気・電子回路
  • Minecraft (レッドストーン回路)
  • ロボット(上記以外の雑多なものはだいたいここに含まれそう)

予定

ざっとした予定は以下のとおりです.

  • 11/24(第1回) C言語での符号とビットシフトについて
  • 11/25(第2回) C言語での構造体とアライメントについて
  • 11/26(第3回) latexmkで楽々LaTeXコンパイル
  • 11/27(第4回) Fresnel積分と緩和曲線
  • 11/28(第5回) 小型ロボットに使いやすい表面実装ブザー
  • 11/29(第6回) 改行コードの歴史的背景
  • 11/30(第7回) 16進数を読み書きできるようになろう 12/1からは未定です.

悲しいことに100回過ぎたあたりからネタ切れを起こしそうなので,何かこういうのを書いてほしいというリクエストがありましたら,コメントでもTwitterでもいいので気軽にお知らせください.

※なんかしっくり来なかったのでシリーズ名を変えました.

Share Comments

dynabook R83にArch Linuxをインストールした際のメモ

dynabook R83にArch Linuxをインストールした際のメモ

dynabook R83/PB

概要

メインで使用しているノートPCであるところの Let’s Note CF-S10 さんが使用歴4年半を迎えて,そろそろハードディスクやバッテリの寿命が訪れそうな時期にさしかかっています. 収入が少し入ったところでもあるので,この際今後5年弱ほど使えるノートPCを買おうということになり,自分の用途に最も合っていそうな dynabook R83/PB を購入することにしました.

Windows を使うのはつらすぎてアレルギーによる発作が原因で直ちに死に至るので,当然 Arch Linux をインストールするわけですが,UEFI なマシンへのインストールは初めてだったため,少しずつメモを取りながら進めました. Web 上に特にこの機種へのインストールに関する情報がなかったので,必要ないかもしれませんがとりあえず書いたので置いておきます. ハマりやすそうなポイントが何箇所かあったので,あえて時系列順に書きます.

注意と免責

試行錯誤の過程が混じっているので,順序通りにやればうまくいくなんてことはないかもしれません.ご注意いただき,ご自身の責任のもとでインストール作業を進めてください. また,前提としてインストールに使用する Arch Linux の ISO は 2015.09 版とします.

Read More

Share Comments

stm32plusでSDIO,FAT32ファイルシステムへのアクセス

stm32plusでSDIO,FAT32ファイルシステムへのアクセス

ログ取り用にmicroSDカードスロットを搭載

Xiphosuraにはログ取り用にmicroSDカードスロットを搭載しています. stm32plusを使うと,STM32のSDIOペリフェラルの初期化が簡単になるほか,ファイルシステムへのアクセスも非常に楽になるのですが,楽になりすぎて学びがないのがちょっと難点です. 何にせよ便利なので使ってみました.

内容としては以下のようにするだけでおっけーです(便利…).

FileSystem *fs;
NullTimeProvider timeProvider;
SdioDmaSdCard *sdcard = new SdioDmaSdCard; // SDIOの初期化が自動的に行われる
if(errorProvider.hasError()) error();

if(!FileSystem::getInstance(*sdcard,timeProvider,fs)) error(); // ファイルシステムの取得

FileInformation *info;
// testという名前のファイルの情報を取得.ファイルが存在すれば{}の中身が実行される.
if(_fs->getFileInformation("test",info)) {
    File *file;
    if(!_fs->openFile("test",file)) error(); // ファイルオープン
    if(!file->write("Hello World",11)) error(); // ファイルに "Hello World" と書き込み
    delete file;
}
else error();
delete info;
delete fs;

参考になりそうなサンプルコード:

Share Comments