2
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

Ethereumマイニングのハッシュレートを7セグLEDに表示する

Last updated at Posted at 2017-08-15

・やってみたこと
プールマイニング、ソロマイニングでのマイニング時のハッシュレートが取得できるので
Raspberry pi からapiによりハッシュレートを取得させる。
 ハッシュレートはi2c接続のArduino経由で7セグledを点灯して表示させる。

 単純にマイニング時のハッシュレートをハード的に表示させることが今回の目的。
 (たぶんこれができたら、Ethウォレットの残額も自ノード経由で7セグLEDまたはキャラクタ液晶に表示ができるのでその事前確認をしてみる。)

接続のざっくりとしたイメージ

ざっくりとしたイメージ (1).jpg

■プールマイニングのハッシュレートの表示
 マイニングPCと同じネットワークにいるraspberry piがnano poolに対してrequest要求を行い
 ハッシュレートを取得する。

■ソロマイニングのハッシュレートの表示
 ライブネットに接続しているマイニング用PCと同じネットワーク上にいる
 raspberry piがEthereumノードに対してjson-rpcでハッシュレートを取得する。

(プールマイニングの場合、画面左下がハッシュレート43Mh/sとして表示した)
118328.jpg

共通

準備するもの

・マイニング用PC(ソロマイニングの場合はライブネット接続済みのもの)
(参考:ライブネット接続方法:http://qiita.com/umidachi/items/44a50ce86e94ff0df8f2)

・7セグメントLED
(参考:http://akizukidenshi.com/catalog/g/gI-04449/)

・Arduino uno
(画像では、arduino bootローダ書き込み済みatmega328を使用)
参考:http://ht-deko.com/arduino/atmega328p.html

・raspbherry pi model B

raspberry piとarduinoのI2c通信

7セグメントledは使用するピン数が多く、raspberry piのGPIOはあまり
いじりたくないのでArduino uno をハード制御用に使う。
raspberry piとI2C通信を行って、arduino uno のIOピンを使って7セグメントLEDを点灯させる。

ArduinoのI2C通信と7セグLED点灯は下記のURLを参考にした。

参考1. I2C通信
https://oscarliang.com/raspberry-pi-arduino-connected-i2c/
参考2. Arduinoでの7セグLED点灯
https://garretlab.web.fc2.com/arduino/introduction/beginning_with_7segment_led/

マスタ、スレーブの関係は下記の通り

マスタ側:raspberry pi B
スレーブ側:Arduino uno

ざっくりとした流れ:
手順1.マスタでハッシュレートをライブネットに接続するノードから取得。
手順2.マスタからスレーブへ値(1バイト)を送信(I2C)
手順3.スレーブで値を取得し7セグLEDを点灯

手順1〜3を繰り返す。(ラズパイのcrontabで定期的に実行)

(手順3のスケッチは長くなるので、割愛。また、1バイトの値を扱うのはI2C通信で一番楽だから。)

以降、手順1〜2のpythonスクリプトを作成する。
ハッシュレートの取得先が変わるのでプールマイニング・ソロマイニングそれぞれでかき分ける。
ただし、手順2はarduinoに値を送るだけなので、かき分ける必要なし。

プールマイニングの場合

raspberry piからマイニングサイトへのAPIリクエスト

プールマイニングを実行するサイトを選択。大体どこもAPIを提供してくれてる。
ここではnanopoolのAPIでraspberry piからリクエストする。
 
 https://eth.nanopool.org/api

マスタ側のコード

class_nanopool.py:nano poolへAPIリクエストするクラス

class_nanopool.py
import json
import requests as rs

class nanopool:
    def __get_api(self,API):
        res=rs.get(API)
        return res.text
    def __analize_result(self,json_str):
        return json.loads(json_str)
    def get_result(self,API):
        json_str=self.__get_api(API)
        return self.__analize_result(json_str)

    @staticmethod
    def getinfo(API):
        nano=nanopool()
        data=nano.get_result(API)
        return data
main.py
import smbus
import time
import math
from class_nanopool import *

bus=smbus.SMBus(1)
address = 0x08

def writeNumber(value):
	bus.write_byte(address,value)
	return 1

def readNumber():
	number=bus.read_byte(address)
	return number

# 手順1に相当

API="https://api.nanopool.org/v1/eth/avghashratelimited/(マイニング時に指定するアドレス)/1"
# ↑の1は1hのハッシュレートを取得するという意味

nano=nanopool()
result=nano.get_result(API)  #nanopoolのAPIリクエスト結果を取得する。

data=math.floor(result['data']) #ハッシュレートが小数点以下は切り捨て(1バイト送信用)

# 手順2に相当
var=int(data)
writeNumber(var)
print(var)
time.sleep(1)

number=readNumber()
print(number)

ソロマイニングの場合

raspberry piからライブネットに接続する自ノードへJSON-RPC APIによるリクエストを行う。

(自ノードはrpc接続できることが前提)
JSON-RPCによるリクエストは下記を参考にする。
https://github.com/ethereum/wiki/wiki/JSON-RPC

”eth_hashrate”のメソッドがあるので、それをpythonベースで利用する。

マスタ側のコード

main.py
import smbus
import time
import math
from class_nanopool import *
from ethquery import *

bus=smbus.SMBus(1)
address = 0x08

def writeNumber(value):
	bus.write_byte(address,value)
	return 1

def readNumber():
	number=bus.read_byte(address)
	return number

# 手順1に相当
url="http://192.168.100.100:8545"
data=eth_hashrate(url)

var=int(math.floor(data / 1000000 ))

# 手順2に相当
writeNumber(var)
print(var)
time.sleep(1)

number=readNumber()
print(number)

これで自ノードとハードウェアの親和性が確認できるようになったのかと思う。
今後は、コントラクトベースでハードウェア制御ができるか確認したい。

 

2
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?