Advertisement
Guest User

Raspbian BusterのRaspberry PiからPythonでPCA9685モジュールを使ってLチカをする

a guest
Jan 19th, 2020
312
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 5.24 KB | None | 0 0
  1. Raspbian BusterのRaspberry PiからPythonでPCA9685モジュールを使ってLチカをする
  2.  
  3. Raspberry PiのI2Cのピンはこんな感じです
  4. https://cdn.sparkfun.com/assets/learn_tutorials/6/7/6/PiZero_1.pdf
  5.  
  6. I2CデバイスのSDAをRaspberry PiのGPIO2に接続します
  7. I2CデバイスのSCLをRaspberry PiのGPIO3に接続します
  8. I2CデバイスのVCCをRaspberry Piの+3.3Vに接続します
  9. I2CデバイスのGNDをRaspberry PiのGNDに接続します
  10.  
  11.  
  12. 1.raspi-configでI2Cを有効にする
  13.  
  14. $ sudo raspi-config
  15.  
  16. 「5 Interfacing Options」を選択
  17. 「P5 I2C」を選択
  18. 「Would you like the ARM I2C interface to be enabled?」で<はい>を選択
  19. 「The ARM I2C interface is enabled」と表示されたら<了解>を選択
  20. 「<Finish>」で終了
  21.  
  22.  
  23. 2.再起動する
  24.  
  25.  
  26. 3.lsmodでi2c_bcm2708があるか確認
  27. $ lsmod
  28.  
  29. hwmon 16384 1 raspberrypi_hwmon
  30. snd_timer 32768 1 snd_pcm
  31. snd 73728 5 snd_timer,snd_bcm2835,snd_pcm
  32. i2c_bcm2835 16384 0
  33. bcm2835_codec 36864 0
  34. bcm2835_v4l2 45056 0
  35.  
  36.  
  37. 4.i2c-toolsを入れる
  38.  
  39. sudo apt-get -y install i2c-tools
  40.  
  41.  
  42. 5.ls -l /dev/i2c*でI2Cデバイスがあるか確認
  43.  
  44. $ ls -l /dev/i2c*
  45.  
  46. crw-rw---- 1 root i2c 89, 1 12月 27 16:39 /dev/i2c-1
  47.  
  48. /dev/i2c-1の場合はbusnum=1になる
  49.  
  50.  
  51. 6.i2cdetectで接続されているI2Cデバイスのアドレスを確認する
  52. $ i2cdetect -y 1
  53.  
  54. 0 1 2 3 4 5 6 7 8 9 a b c d e f
  55. 00: -- -- -- -- -- -- -- -- -- -- -- -- --
  56. 10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
  57. 20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
  58. 30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
  59. 40: 40 -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
  60. 50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
  61. 60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
  62. 70: -- -- -- -- -- -- -- --
  63.  
  64. これでbusnum=1のI2Cに接続されているI2CデバイスのI2Cのアドレスがわかります
  65. (busnumとI2Cのアドレスは後で使います)
  66. この例の場合だとI2Cのアドレスは0x40になります
  67.  
  68.  
  69. 7.Adafruit_Python_PureIOを入れる
  70. https://github.com/adafruit/Adafruit_Python_PureIO
  71.  
  72. $ sudo pip3 install Adafruit-PureIO
  73.  
  74.  
  75. 8.Adafruit_Python_GPIOを入れる
  76. https://github.com/adafruit/Adafruit_Python_GPIO
  77.  
  78. $ sudo apt-get update
  79. $ sudo apt-get install build-essential python3-pip python3-dev python3-smbus git
  80. $ git clone https://github.com/adafruit/Adafruit_Python_GPIO.git
  81. $ cd Adafruit_Python_GPIO
  82. $ sudo python3 setup.py install
  83.  
  84.  
  85. 9.Adafruit_Python_PCA9685を入れる
  86.  
  87. $ sudo pip3 install adafruit-pca9685
  88.  
  89.  
  90. これでI2Cの設定、必要なライブラリのインストールは終了です
  91.  
  92.  
  93.  
  94. pca9685_test01.pyという名前で下記の内容でファイルを作成
  95.  
  96. from __future__ import division
  97. import Adafruit_GPIO.I2C as I2C
  98. import Adafruit_PCA9685
  99.  
  100. import time
  101. import math
  102.  
  103.  
  104. pwm = Adafruit_PCA9685.PCA9685(address=0x40, busnum=1)
  105. i2c = I2C
  106. device = i2c.get_i2c_device(0x40, busnum=1)
  107.  
  108. def get_pwm(index):
  109. _data0 = device.readU8(0x06 + 4 * index)
  110. _data1 = device.readU8(0x07 + 4 * index)
  111. _data2 = device.readU8(0x08 + 4 * index)
  112. _data3 = device.readU8(0x09 + 4 * index)
  113. data0 = int(_data1 << 8 | _data0)
  114. data1 = int(_data3 << 8 | _data2)
  115. pwm_read = (data0, data1)
  116. return pwm_read
  117.  
  118.  
  119. def duty(index, value=None, invert=None):
  120.  
  121. if value is None:
  122. pwm_read = get_pwm(index)
  123.  
  124. if pwm_read == (0, 4096):
  125. value = 0
  126. elif pwm_read == (4096, 0):
  127. value = 4095
  128. else:
  129. value = pwm_read[1]
  130. if invert:
  131. value = 4095 - value
  132. return value
  133.  
  134. if not 0 <= value <= 4095:
  135. raise ValueError("Out of range")
  136. if invert:
  137. value = 4095 - value
  138. if value == 0:
  139. pwm.set_pwm(index, 0, 4096)
  140. elif value == 4095:
  141. pwm.set_pwm(index, 4096, 0)
  142. else:
  143. pwm.set_pwm(index, 0, value)
  144.  
  145.  
  146. def func01(num):
  147. a01 = num % 160
  148. if (a01) < 80.0:
  149. a02 = (1.0 / 80.0 * a01)
  150. else :
  151. a02 = (1.0 / 80.0 * (160.0 - a01))
  152. return a02 * a02 * a02
  153.  
  154.  
  155. # Set frequency to 60hz, good for servos.
  156. pwm.set_pwm_freq(240)
  157.  
  158. while True:
  159. for k in range(8):
  160. for j in range(0,160, 10):
  161. for i in range(16):
  162. f01 = func01(int(320.0 / 16.0 * i + j))
  163. val01 = int(f01 * 4095.0)
  164. duty(i, value=4095 - val01)
  165. time.sleep(0.1)
  166. for i in range(16):
  167. duty(i, value=4095)
  168. time.sleep(0.5)
  169. for i in range(16):
  170. duty(i, value=0)
  171. time.sleep(1)
  172. for i in range(16):
  173. duty(i, value=4095)
  174. time.sleep(1)
  175. for i in range(16):
  176. duty(i, value=0)
  177. time.sleep(1)
  178. for i in range(16):
  179. duty(i, value=4095)
  180. time.sleep(1)
  181.  
  182.  
  183. 実行
  184. python3 pca9685_test01.py
  185.  
  186. 上のプログラムは16個のLEDをPCA9685にシンク接続した場合のプログラムです
  187.  
  188. micropython-adafruit-pca9685
  189. https://github.com/adafruit/micropython-adafruit-pca9685
  190.  
  191. このmicropython用のライブラリを参考にすればサーボモータも簡単に扱えると思われます
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement