Skip to main content

USBメモリ復旧

OpenMediaVaultの起動ディスクに使っていたTranscendの安USBメモリは3ヶ月後に死んだ。
起動ディスクとしてのUSBメモリの運用は読み書きが多いので薦められないと言われていたものなのでTranscendの品質の問題ではない。これはUSBメモリの仕組み上しょうがないものである。
死んだと言っても実際にどうなったかというと、USBメモリとしてハードウエアの認識(マウント)はするが中身が空。フォーマットをしようとしても書き込み不可になってしまいどうにも出来ない状態になってしまった。まったく使えないUSBメモリになったわけだ。
当時、修復ツール等を試してみたが書き込み禁止のメッセージが出て何もできなかった。
安物だったのでそのままジャンク箱へ入れた。これが二年くらい前の話。

最近になってTranscendのサイトにある修復ツール(JetFlash Online Recovery)をなんとなく試してみた。
使ってみると途中で固まってしまう。やっぱダメかと思ったがそのまま放置していたらいつの間にか処理が完了していた。30分くらい放置していたのではないかと思う。
そうしたら普通に読み書きが出来るUSBメモリになった。
直った?ファイルを書き込んだり読み出したりできている。

一度酷使したメモリなので重要な用途に使う気は無いが、一時的に使うUSBメモリとして使おう。少しうれしいですね。Transcendの好感度が上がった。
Transcend JetFlash 300 4GB TS4GJF300 (安物)

ちなみに同時期に同じ使い方をしてダメになったよく知らないブランドのUSBメモリも修復を試してみたがTranscendじゃないのでダメでした。こっちはただのゴミのままです。

マジで使うUSBメモリのおすすめはSanDisk Extreme USB3.0 (SDCZ80) だけど、日常使いのものならば修復ツールが優秀そうなTranscendが安くていいかも。Transcend より安いものもあるが、100円くらいの差ならTranscendがよくね?という話。
(個人の感想です)

pi で遊んでみる (GPIO)

DS18B20 温度センサーの追加。

ds18ledpicRaspberry Pi にはGPIOがあるのが特徴です。ここにいろいろなものを接続することができます。普通のPCではこれができません。
自作のものをつけるので基板が壊れる可能性があるのですが、Raspberry Piなら壊れても損害額は小さくなります。これがいいところですね。

今回は簡単に使えて、わかりやすいセンサーを試してみました。温度センサのDS18B20 (秋月で300円。高い方だな。) です。温度をデジタルの数値で返すセンサなので調整不要なところがいいですね。

ds18led今回はDS18B20とLEDをGPIOにつけるためにこんな風にハンダ付けしてまとめました。
本体から離すためにコードの先についているのが温度センサです。
LEDは二色のLEDを使っています。(手元に余っていたので)
図は Raspberry Pi の基板にさした状態を上から見た図です。写真の反対側から見たものになります。緑と赤のLEDがそれぞれGPIO17と27に繋がっています。
rootではないと作業が出来ない場合があるのでそのときはsudo -iでrootになってしまうのも手です。

LED点灯

LEDの点滅は以下のようにできます。

## Set up GPIO 17,27 and set to output
$ echo "17" > /sys/class/gpio/export
$ echo "27" > /sys/class/gpio/export
$ echo "out" > /sys/class/gpio/gpio17/direction
$ echo "out" > /sys/class/gpio/gpio27/direction

## Write output
$ echo "1" > /sys/class/gpio/gpio17/value
$ echo "1" > /sys/class/gpio/gpio27/value

## Write output
$ echo "0" > /sys/class/gpio/gpio17/value
$ echo "0" > /sys/class/gpio/gpio27/value

## Clean up
$ echo "17" > /sys/class/gpio/unexport
$ echo "27" > /sys/class/gpio/unexport

ledtest.sh (シェルスクリプト)

#!/bin/sh
## Set up GPIO 17,27 and set to output
echo "17" > /sys/class/gpio/export
echo "27" > /sys/class/gpio/export
echo "out" > /sys/class/gpio/gpio17/direction
echo "out" > /sys/class/gpio/gpio27/direction

## Write output...
echo "1" > /sys/class/gpio/gpio17/value
echo "0" > /sys/class/gpio/gpio27/value
sleep 2
echo "0" > /sys/class/gpio/gpio17/value
echo "1" > /sys/class/gpio/gpio27/value
sleep 2
echo "1" > /sys/class/gpio/gpio17/value
echo "1" > /sys/class/gpio/gpio27/value
sleep 2

## Write output 0 
echo "0" > /sys/class/gpio/gpio17/value
echo "0" > /sys/class/gpio/gpio27/value

## Clean up
echo "17" > /sys/class/gpio/unexport
echo "27" > /sys/class/gpio/unexport

これでLEDが点いたり付いたりします。
単純なことですが、これを普通のパソコンでやるのは難しいし、配線を間違えてマザーボードを壊す事などを考えるとこのRaspberry pi でこういうことが出来ることの便利さを感じます。
LEDの部分をブザーにしたら音が鳴ります。モータにしたら回転します。リレーにすれば家電が動きます。赤外線LEDをつければリモコンが動きます。
「ロボット」というものはこういうもので出来ているわけです。

まずはLEDを点滅できるというのをテストしてみました。
これだけでもサーバで何かをチェックして点灯させるという仕組みを作れば便利です。

gpiozero

最近はスクリプトはpythonで書くようなので、GPIO用のモジュールがすでにインストールされていました。
GPIO17のピンにつないだLEDを点滅させるのは以下のスクリプトを実行です。

from gpiozero import LED
from time import sleep

led = LED(17)

while True:
    led.on()
    sleep(1)
    led.off()
    sleep(1)

温度計 (DS18B20)

温度センサをつけると室温が測れるようになります。意外と自宅の室温のログを取る道具が無いものなので便利です。夏はサーバ周りの温度をチェックしていました。これで留守の間、エアコンを止めている間の温度がわかります。ペットを飼っている人にも便利でしょう。
今回は秋月で買ってきた温度センサを使ってみます。このセンサの使い方は英語ですが詳しく書いてあるものがありました。アメリカのパーツ屋さんの資料です。
http://learn.adafruit.com/downloads/pdf/adafruits-raspberry-pi-lesson-11-ds18b20-temperature-sensing.pdf

2016年3月に以前書いていた通りに作業をしようとしたらうまく認識してくれません。
少し試行錯誤してみました。

$ sudo echo dtoverlay=w1-gpio-pullup=on,gpiopin=4 >> /boot/config.txt
$ sudo modprobe w1-therm
$ ls /sys/bus/w1/devices/
28-000003b716fb  w1_bus_master1

次のようなコマンドで温度が表示されます。
これは摂氏(℃)で表示されるので使いやすいのですが、マイナスの値は使用できません。そのためマイナスの温度が無さそうな室温を測るのに使ってみました。

$ sudo modprobe w1-gpio
$ sudo modprobe w1-therm
$ ls /sys/bus/w1/devices/
28-000003b716fb  w1_bus_master1
$ cat /sys/bus/w1/devices/28-000003b716fb/w1_slave
71 01 4b 46 7f ff 0f 10 56 : crc=56 YES
71 01 4b 46 7f ff 0f 10 56 t=23062

結果の一行目がYESの時の二行目のt=の値が温度です。1000倍した値が出ています。
センサが一個だけならば cat /sys/bus/w1/devices/28-*/w1_slave でもいいですね。
テキストで値が取れればあとは適当に編集すればいろいろと使えます。

CPU温度

CPUの中に温度センサがすでに入っているのでCPUの温度は知る事ができます。次の様に表示できます。

cat /sys/class/thermal/thermal_zone0/temp

こんなスクリプトを作ってみました。
温度センサの値とCPU温度を表示します。これはあとでMRTGで使います。

#!/bin/sh
#
temp1=0
temp2=0
temp1max=0
temp2max=0
temp1min=99999
temp2min=99999
wk1=0
wk2=0
temp1path="/sys/bus/w1/devices/28-000003b716fb/w1_slave"
temp2path="/sys/class/thermal/thermal_zone0/temp"
# function
cputemp()
{
  wk=`cat ${temp2path}`
  return $wk
}
roomtemp()
{
  wk=`cat ${temp1path}`
  yes=`echo ${wk} | grep -c "YES"` 
  if [ ${yes} -eq 1 ];then
    tmp=`echo ${wk} | grep "t\=" | sed -e s/^.*t=// `
    return ${tmp}
  else
    return 0
  fi
}
# main
for i in 0 1 2 3 4
do
  sleep 0.5
  cputemp
  temp1=$?
  roomtemp
  temp2=$?
##  echo $temp1 $temp2

  if [ $temp1 -le $temp1min ];then
    temp1min=$temp1
  fi
  if [ $temp1 -ge $temp1max ];then
    temp1max=$temp1
  fi
  if [ $temp2 -le $temp2min ];then
    temp2min=$temp2
  fi
  if [ $temp2 -ge $temp2max ];then
    temp2max=$temp2
  fi
  wk1=`expr ${wk1} + $temp1`
  wk2=`expr ${wk2} + $temp2`
done
#
temp1=`expr \( ${wk1} - $temp1min - $temp1max \) / 3 `
temp2=`expr \( ${wk2} - $temp2min - $temp2max \) / 3 `
echo $temp1
echo $temp2
echo "0"
echo "Temp"
##__END__

(2014/12/1)
(2016/3/21)