はんだ付け動画をアップしました

YouTubeに動画をアップしました。

www.youtube.com
技術書典11で販売している書籍『GPIB-USBインターフェースを自作して計測器をPC制御してみた』で、実際にGPIBコネクタとArduino Nano(互換ボード)をはんだ付けしている動画です。 少しカメラの位置がずれてますが(汗)実際に制作してみたい方への参考になれば幸いです。

【新刊】技術書典11に出展しました!

こちらのブログでは告知が遅くなったのですが、技術書典11さんにてオンライン出展させていただいております。

techbookfest.org
新刊を一冊出しました。
タイトルは『GPIB-USBインターフェースを自作して計測器をPC制御してみた』。
500円とお求めやすい価格となっております。

その名の通り、GPIB-USB変換のインターフェースを作り、計測器を実際にPCから制御するまでの一連をまとめました。
ノウハウを出し惜しみ無く書いたので、この本があれば同じように再現できると思います。
古い計測器を自動制御かけたいけどGPIBしかついていない、GPIB制御のツールが手元に無い、既存のソフトウェアは導入が大変……そんな方々に朗報です。
昔GPIB使ってたなぁ、とかどんな動作していたんだろう?と思い出に浸りたい方にもぜひ!
Arduinoの色んな応用について知りたい方や、何かしらのプロトコルを作りたい方にもヒントになるかもしれません。


もし売れたら続刊も出る、かも!   よろしくお願いします!

計測器棚を整理しました。

メタルシェルフを追加で購入して、床に置きっぱなしだった計測器を棚に整理しました!!

f:id:positivefeedback:20210619062457j:plain

横河の直流電源なんかは脚が取れてたので、自作なんかしてみたり。

f:id:positivefeedback:20210619062437j:plain

部屋や机のスペースの関係で自室には直接置けないため、キャスターでの移動を考えて配置したのですがわりかしうまくいった気がします。

YouTubeチャンネルを開設しました。

www.youtube.com

YouTubeに電子工作のチャンネルを開設しました。

「くじけない電子工作」ということで、失敗例も含めて色々アップできたらいいなと。


www.youtube.com

最初にアップした動画は過去に作った自作プリント基板です。 専用紙にレーザープリンタでパターンを印刷して、ラミネートでトナーを転写してエッチングしています。 初めての製作でしたが、単3電池2本の電池ボックスの上にうまく配置されるようそれなりに小さく作れたのではと思っています。 エッチングがなかなかうまく行かなかったりして、色々調べてから完成するまでに一年ぐらいかかった記憶があります。

今後はそういった試行錯誤も踏まえて動画をアップできればなと思っています。

CRC-15-CANを計算するプログラムを書いた

(この記事はQiitaで書いた下記記事と同一です。)

qiita.com

はじめに

仕事でCAN通信のプログラムを書いているんだけど、CRCエラーの表示が出る。 デバッグのために、CRCの変換プログラムが必要になっった。 CANのCRCCRC-15という特殊なフォーマットでネット上に資料が少ない。 ソースや調べたことをまとめておくことにした。

実装例

言語はCを使用。

#include <stdio.h>
#include <stdint.h>

// int to bin
char* int_to_binstr(int bin, int len)
{
int i;
static char buff[32];

for (i = 0; i < len; i++) {
if (bin & (1UL << (len - i - 1))) {
buff[i] = '1';
}
else {
buff[i] = '0';
}
}
buff[len] = '\0';
return buff;
}

uint16_t can_crc_next(uint16_t crc, uint8_t data)
{
uint8_t i;
crc ^= (uint16_t)data << 7;

for (i = 0; i < 8; i++) {
crc <<= 1;
if (crc & 0x8000) {
crc ^= 0xc599;
}
}
return crc & 0x7fff;
}

void cal_crc15(unsigned char* buff, int len) {
uint16_t crc;
crc = 0;

printf("crc15 0x");
for (int i = 0; i < len; i++) {
printf("%02X ", buff[i]);
}

printf("\n-> ");

for (int i = 0; i < len; i++) {
crc = can_crc_next(crc, buff[i]);
}
char binstr[16];
printf("0x%04X(%s)\n", crc, int_to_binstr(binstr, (int)crc, 15));
}

int main()
{
int i;
uint8_t data[] = { 0x00, 0x80, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };
cal_crc15(data, 11);
}

CRC元データについて

CRCの元データはSOFからデータまで。スタッフビットは除く。 バイナリはHEXにする。 SOF側が半端なビットになるようにする。

uint8_t data[] = { 0x00, 0x80, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }

プログラムの動作

CRCの初期値は0。

crc = 0;

データをHEXごとに取り出して7ビット左シフトしてCRC排他的論理和をとる。

crc ^= (uint16_t)data << 7;

CRCを1ビット左シフト

crc <<= 1;

CRCの最上位ビットが1なら、CRC15の生成多項式x15 + x14 + x10 + x8 + x7 + x4 + x3 + 1(=0xc599)との排他的論理和を取る。

if (crc & 0x8000) {
crc ^= 0xc599;
}

15ビットなので16ビットの最上位ビットを省く。

return crc & 0x7fff;

注意

CANコントローラ(MCP2515)の吐き出した値と一致することは確認できているが、CAN15の仕様と完全に一致しているかは確認できていない。 おそらく大丈夫だとは思うが。

参考URL

http://forum.easyelectronics.ru/viewtopic.php?f=49&t=34508

USBのCRC:回路とCソース - Qiita

任意の CRC 値になるバイト列を逆算してみよう - Qiita

巡回冗長検査 - Wikipedia

Catalogue of parametrised CRC algorithms