パルスジェネレータが欲しかったんだけど水晶振動子や抵抗やコンデンサなど、結局材料が手元に何も無かったのでソフトウェアでやることに。
環境
- Mac OS X 10.9.5
方針
- USB-RS232CアダプタをかませてRS-232Cのどこかの出力を振動させる。
- 出力電圧などはとりあえず置いておいて、とにかく振動させることを目的とする。
参考文献
キモ
int fd = open(argv[1], O_RDWR | O_NONBLOCK);
int modem = 0;
ioctl(fd, TIOCMGET, &modem);
modem |= TIOCM_DTR;
ioctl(fd, TIOCMSET, &modem);
modem &= ~TIOCM_DTR;
ioctl(fd, TIOCMSET, &modem);
close(fd);
ioctl(fd, TIOCMGET, &modem)
でモデム状態を取得し、modem |= TIOCM_DTR
もしくは、modem &= ~TIOCM_DTR
でDTR信号だけを変化させる。それをioctl(fd, TIOCMSET, &modem)
で設定してやることで、DTR信号の電圧を変化させることができる。
ちなみにargv[1]
には、実行時に引数に与える/dev/tty.usbserial-FTG97M9S
みたいなのが入る。BUFFALOのUSB-RS232Cアダプタケーブル使ったらこれだった。
上記のコードを適当に使ってやると、手元の環境では+10Vと-10Vで振動した。
その他
いろいろ試した内容は文章にするのが大変なので、以下箇条書き。
- RTS信号を変化させようと
TIOCM_RTS
を使ってみたけど、変化しなかった。 - Wikipediaで入出力がOUTになっている信号しかホスト側からは制御できないだろうと予想。
-
write()
などを使用してTxDに書き出す方法でもできないことは無いんだろうけど、スタートビット、パリティビット、ストップビットなどが付与されちゃって、思い通りの波形にならないだろうと予想。