CocoPi.py 66 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801
  1. '''
  2. =========================================================
  3. ______ ______
  4. /\ _ \ /\ _ \ __
  5. \ \ \/\_\ ____ ____ ___\ \ \_\ \/\_\
  6. \ \ \/_/_ / __ \ / __ \ / __'\ \ __/\/_/_
  7. \ \ \_\ \/\ \_\ \/\ \__//\ \_\ \ \ \/ /\ \
  8. \ \____/\ \____/\ \____\ \____/\ \_\ \ \_\
  9. \/___/ \/___/ \/____/\/___/ \/_/ \/_/
  10. __
  11. /\ \ __ ----------------
  12. \ \ \ /\_\ ____ __ __ __ _ pi.cocorobo.cn
  13. \ \ \ \/_/_ / _ \/\ \/\ \/\ \/ \ ----------------
  14. \ \ \____ /\ \/\ \/\ \ \ \_\ \/> </ SYSTEM VERSION
  15. \ \_____\\ \_\ \_\ \_\ \____//\_/\_\ -- 24.07.05 ---
  16. \/_____/ \/_/\/_/\/_/\/___/ \//\/_/ ----------------
  17. =========================================================
  18. '''
  19. #########################################################
  20. # ------------------------------------------------------
  21. #| 封装包内容: | 类名称: |
  22. #|-------------------------------|----------------------|
  23. #| 2023.02.16: | |
  24. #| 【添加】 | |
  25. #| 1、AHT20温湿度传感器 | AHT20 |
  26. #| 2、MPU6050陀螺仪六轴传感器 | MPU6050 |
  27. #| 3、板载4颗按钮A、B、C、D | BUTTON |
  28. #| 4、光线强度传感器 | LIGHTINTENSITY |
  29. #| 5、板载LED灯! | LED |
  30. #| 6、直流电机 | DCMOTOR |
  31. #| 7、模拟舵机 | SERVO |
  32. #|------------------------------------------------------|
  33. #| 2023.02.27: | |
  34. #| 【修复完善】 | BUTTON、LED |
  35. #| 【添加】 | WIFI |
  36. #|------------------------------------------------------|
  37. #| 2023.03.09: | |
  38. #| 【修复完善】 | LED |
  39. #|------------------------------------------------------|
  40. #| 2023.03.14: | |
  41. #| 【修复完善】 | SERVO |
  42. #|-------------------------------------------------------
  43. #| 2023.06.01: | |
  44. #| 【替换】 | BUTTON |
  45. #| 【替换】 | LED |
  46. #| 【替换】 | DCMOTOR |
  47. #| 【替换】 | SERVO |
  48. #| 【添加】 | RGB |
  49. #| 【添加】 | ADC |
  50. #| 【添加】 | DAC |
  51. #| 【添加】 | INPUT |
  52. #| 【添加】 | OUT |
  53. #| 【添加】 | UvcVideo |
  54. #|-------------------------------------------------------
  55. #| 2023.06.15: | |
  56. #| 【更改】 | STM8S |
  57. #|-------------------------------------------------------
  58. #| 2023.08.17: | |
  59. #| 【更改】 | DCMOTOR |
  60. #|-------------------------------------------------------
  61. #| 2023.08.25: | |
  62. #| 【更改】 | BUZZER |
  63. #|-------------------------------------------------------
  64. #| 2023.09.28: | |
  65. #| 【更改】 | QMI8658 |
  66. #########################################################
  67. #|-------------------------------------------------------
  68. #| 2024.02.22: | |
  69. #| 【更改】 | QMI8658 |
  70. #########################################################
  71. #| 2024.02.28: | |
  72. #| 【更改】 | STM8S |
  73. #########################################################
  74. #| 2024.03.07: | |
  75. #| 【添加】 | GPTrequest |
  76. #########################################################
  77. #| 2024.03.11: | |
  78. #| 【修改】 | LED |
  79. #| 【修改】 | DCMOTOR |
  80. #########################################################
  81. #| 2024.03.22: | |
  82. #| 【增加】 | RTC |
  83. #| 【增加】 | PCA9685 |
  84. #########################################################
  85. #| 2024.04.10: | |
  86. #| 【修改】 | GPTrequest |
  87. #########################################################
  88. #| 2024.07.05: | |
  89. #| 【增加】 | LazyImport |
  90. #| 【针对】 | GPTrequest |
  91. #| 【针对】 | uuid |
  92. #| 【针对】 | json |
  93. #| 【针对】 | base64 |
  94. #| 【修改】 | STM8S |
  95. #| 【修改】 | DCMOTOR |
  96. #| 【修改】 | multiFuncGpio |
  97. #| 【增加】 | DS3231 |
  98. #| 【增加】 | SPI_WS2812 |
  99. #| 【增加】 | HCSR04 |
  100. #| 【增加】 | extDcMotor |
  101. #| 【增加】 | extServo |
  102. #| 【增加】 | extGpio |
  103. #| 【拆分】 | GPTrequest |
  104. #########################################################
  105. from smbus2 import SMBus, i2c_msg
  106. import time
  107. import math
  108. from maix import gpio
  109. import os
  110. import SUNXI_GPIO
  111. from maix import camera
  112. import time
  113. import sys
  114. #20240715
  115. import threading
  116. sys.path.append('/root/preset/server')
  117. ##################################
  118. # 1、AHT20温湿度传感器 #
  119. ##################################
  120. # 20250715
  121. AHT20_I2CADDR = 0x38
  122. AHT20_CMD_SOFTRESET = [0xBA]
  123. AHT20_CMD_INITIALIZE = [0xBE, 0x08, 0x00]
  124. AHT20_CMD_MEASURE = [0xAC, 0x33, 0x00]
  125. AHT20_STATUSBIT_BUSY = 7 # The 7th bit is the Busy indication bit. 1 = Busy, 0 = not.
  126. AHT20_STATUSBIT_CALIBRATED = 3 # The 3rd bit is the CAL (calibration) Enable bit. 1 = Calibrated, 0 = not
  127. class AHT20:
  128. def __init__(self, bus_num=2):
  129. self.bus_num = bus_num
  130. self.bus = SMBus(bus_num)
  131. # self._initialize_sensor()
  132. def _initialize_sensor(self):
  133. self._write_command([0xBA])
  134. time.sleep(0.04)
  135. self._write_command([0xBE, 0x08, 0x00])
  136. time.sleep(0.01)
  137. while not self._is_calibrated():
  138. time.sleep(0.01)
  139. def _write_command(self, command):
  140. msg = i2c_msg.write(0x38, command)
  141. self.bus.i2c_rdwr(msg)
  142. def _read_data(self, length):
  143. msg = i2c_msg.read(0x38, length)
  144. self.bus.i2c_rdwr(msg)
  145. return list(msg)
  146. def _is_calibrated(self):
  147. status = self._read_data(1)[0]
  148. return (status >> 3) & 1
  149. def _trigger_measurement(self):
  150. self._write_command([0xAC, 0x33, 0x00])
  151. start_time = time.time()
  152. time.sleep(85 * 10**-3)
  153. while True:
  154. data = self._read_data(7)
  155. if not (data[0] >> 7) & 1: # Check busy bit
  156. return data
  157. if time.time() - start_time > 0.08:
  158. raise TimeoutError("AHT20 measurement timeout")
  159. time.sleep(0.01)
  160. def _crc8(self, data):
  161. crc = 0xFF
  162. for byte in data:
  163. crc ^= byte
  164. for _ in range(8):
  165. if crc & 0x80:
  166. crc = (crc << 1) ^ 0x31
  167. else:
  168. crc <<= 1
  169. crc &= 0xFF
  170. return crc
  171. def read_raw_data(self):
  172. data = self._trigger_measurement()
  173. crc = self._crc8(data[:6])
  174. if crc != data[6]:
  175. raise ValueError("CRC check failed")
  176. return data
  177. def get_humidity(self):
  178. data = self.read_raw_data()
  179. raw_humidity = ((data[1] << 16) | (data[2] << 8) | data[3]) >> 4
  180. return (raw_humidity * 100.0) / (2**20)
  181. def get_temperature(self):
  182. data = self.read_raw_data()
  183. raw_temp = ((data[3] & 0x0F) << 16) | (data[4] << 8) | data[5]
  184. return (raw_temp * 200.0) / (2**20) - 50.0
  185. ##################################
  186. # 2、MPU6050陀螺仪六轴传感器 #
  187. ##################################
  188. SLAVE_ADDR = 0x68
  189. PWR_MGMT_1 = 0x6B
  190. PWR_MGMT_2 = 0x6C
  191. WHO_AM_I = 0x75
  192. GYRO_X = 0x43
  193. GYRO_Y = 0x45
  194. GYRO_Z = 0x47
  195. ACCL_X = 0x3B
  196. ACCL_Y = 0x3D
  197. ACCL_Z = 0x3F
  198. class MPU6050:
  199. def __init__(self, BusNum=2):
  200. # Initialize mpu6050
  201. self.BusNum = BusNum
  202. self.cmd_soft_reset()
  203. def cmd_soft_reset(self):
  204. # Send the command to soft reset
  205. with SMBus(self.BusNum) as bus:
  206. bus.write_byte_data(SLAVE_ADDR, PWR_MGMT_1, 0)
  207. time.sleep(0.04) # Wait 40 ms after poweron
  208. def read_byte(self,addr):
  209. with SMBus(self.BusNum) as bus:
  210. return bus.read_byte_data(SLAVE_ADDR,addr)
  211. def read_word(self,addr):
  212. with SMBus(self.BusNum) as bus:
  213. h = bus.read_byte_data(SLAVE_ADDR, addr)
  214. l = bus.read_byte_data(SLAVE_ADDR, addr+1)
  215. val = (h << 8) + l
  216. return val
  217. def read_word_i2c(self,addr):
  218. val = self.read_word(addr)
  219. if (val >= 0x8000):
  220. return -((65535 - val) + 1)
  221. else:
  222. return val
  223. def dist(self,x, y):
  224. return math.sqrt((x*x) + (y*y))
  225. def get_x_rotat(self,x,y, z):
  226. rad = math.atan2(y,self.dist(x, z))
  227. return math.degrees(rad)
  228. def get_y_rotat(self,x, y, z):
  229. rad = math.atan2(x,self.dist(y, z))
  230. return -math.degrees(rad)
  231. def read_gyro(self):
  232. GYR_X = self.read_word_i2c(GYRO_X)
  233. GYR_Y = self.read_word_i2c(GYRO_Y)
  234. GYR_Z = self.read_word_i2c(GYRO_Z)
  235. #print ("GYRO -> X:{:04.2f} Y:{:04.2f} Z:{:04.2f}".format((GYR_X/131), (GYR_Y/131), (GYR_Z/131)))
  236. return (GYR_X/131), (GYR_Y/131), (GYR_Z/131)
  237. def read_acc(self):
  238. ACC_X = self.read_word_i2c(ACCL_X)
  239. ACC_Y = self.read_word_i2c(ACCL_Y)
  240. ACC_Z = self.read_word_i2c(ACCL_Z)
  241. CALC_ACC_X = ACC_X/16384.0
  242. CALC_ACC_Y = ACC_Y/16384.0
  243. CALC_ACC_Z = ACC_Z/16384.0
  244. #print ("ACCL -> X:{:04.2f} Y:{:04.2f} Z:{:04.2f}".format(CALC_ACC_X, CALC_ACC_Y, CALC_ACC_Z))
  245. #print("ROTATE -> X:{:04.2f} Y:{:04.2f}\n".format(get_x_rotat(CALC_ACC_X, CALC_ACC_Y, CALC_ACC_Z), get_y_rotat(CALC_ACC_X, CALC_ACC_Y, CALC_ACC_Z)))
  246. return CALC_ACC_X, CALC_ACC_Y, CALC_ACC_Z,self.get_x_rotat(CALC_ACC_X, CALC_ACC_Y, CALC_ACC_Z),self.get_y_rotat(CALC_ACC_X, CALC_ACC_Y, CALC_ACC_Z)
  247. def get_gyro_x(self):
  248. return self.read_gyro()[0]
  249. def get_gyro_y(self):
  250. return self.read_gyro()[1]
  251. def get_gyro_z(self):
  252. return self.read_gyro()[2]
  253. def get_acc_x(self):
  254. return self.read_acc()[0]
  255. def get_acc_y(self):
  256. return self.read_acc()[1]
  257. def get_acc_z(self):
  258. return self.read_acc()[2]
  259. def get_angle_x(self):
  260. return self.read_acc()[3]
  261. def get_angle_y(self):
  262. return self.read_acc()[4]
  263. ##################################
  264. # 3、板载4颗按钮A、B、C、D #
  265. ##################################
  266. class BUTTON:
  267. def __init__(self, gpioId):
  268. self.gpio=224+gpioId
  269. SUNXI_GPIO.setcfg(self.gpio, SUNXI_GPIO.IN)
  270. def is_pressed(self):
  271. self.getValue=SUNXI_GPIO.input(self.gpio)
  272. if self.getValue != 1:
  273. return True
  274. else:
  275. return False
  276. ##################################
  277. # 4、光线强度传感器 #
  278. ##################################
  279. class LIGHTINTENSITY:
  280. def __init__(self, addr=b"0x05070080") -> None:
  281. self.addr = addr
  282. self.path = "/sys/class/sunxi_dump/dump"
  283. self.file = open(self.path, "wb+")
  284. self.last = self.value()
  285. def value(self):
  286. self.file.write(b"0x05070080")
  287. self.file.seek(0)
  288. return int(self.file.read()[:-1], 16)
  289. def __del__(self):
  290. try:
  291. if self.file:
  292. self.file.close()
  293. del self.file
  294. except Exception as e:
  295. pass
  296. ##################################
  297. # 5、板载LED灯 #
  298. ##################################
  299. class LED:
  300. def __init__(self, gpioId=69):
  301. self.gpioId=gpioId
  302. SUNXI_GPIO.setcfg(self.gpioId, SUNXI_GPIO.OUT)
  303. SUNXI_GPIO.setcfg(259, SUNXI_GPIO.OUT)
  304. def out(self,value):
  305. if value==0 or value==1:
  306. self.value=1-value
  307. else:
  308. self.value=0
  309. SUNXI_GPIO.output(self.gpioId,self.value)
  310. SUNXI_GPIO.output(259,self.value)
  311. ##################################
  312. # 6、QMI8658 #
  313. ##################################
  314. class QMI8658(object):
  315. def __init__(self, smbus=2, address=0X6B):
  316. self._address = address
  317. import smbus2
  318. self._bus = smbus2.SMBus(smbus)
  319. bRet = self.WhoAmI()
  320. if bRet:
  321. self.Read_Revision()
  322. else:
  323. return None
  324. self.Config_apply()
  325. def _read_byte(self, cmd):
  326. rec = self._bus.read_i2c_block_data(int(self._address), int(cmd), 1)
  327. return rec[0]
  328. def _read_block(self, reg, length=1):
  329. rec = self._bus.read_i2c_block_data(int(self._address), int(reg), length)
  330. return rec
  331. def _read_u16(self, cmd):
  332. LSB = self._bus.read_i2c_block_data(int(self._address), int(cmd), 1)
  333. MSB = self._bus.read_i2c_block_data(int(self._address), int(cmd)+1, 1)
  334. return (MSB[0] << 8) + LSB[0]
  335. def _write_byte(self, cmd, val):
  336. self._bus.write_i2c_block_data(int(self._address), int(cmd), bytes([int(val)]))
  337. def WhoAmI(self):
  338. bRet = False
  339. if (0x05) == self._read_byte(0x00):
  340. bRet = True
  341. return bRet
  342. def Read_Revision(self):
  343. return self._read_byte(0x01)
  344. def Config_apply(self):
  345. self._write_byte(0x02, 0x40)
  346. self._write_byte(0x08, 0x03)
  347. self._write_byte(0x03, 0x04)
  348. self._write_byte(0x04, 0x64)
  349. self._write_byte(0x06, 0x11)
  350. def Read_Raw_XYZ(self):
  351. xyz = [0, 0, 0, 0, 0, 0]
  352. vals={}
  353. raw_timestamp = self._read_block(0x30, 3)
  354. raw_acc_xyz = self._read_block(0x35, 6)
  355. raw_gyro_xyz = self._read_block(0x3b, 6)
  356. raw_xyz = self._read_block(0x35, 12)
  357. timestamp = (raw_timestamp[2] << 16) | (
  358. raw_timestamp[1] << 8) | (raw_timestamp[0])
  359. for i in range(6):
  360. xyz[i] = (raw_xyz[(i*2)+1] << 8) | (raw_xyz[i*2])
  361. if xyz[i] >= 32767:
  362. xyz[i] = xyz[i]-65535
  363. vals["AcX"]=xyz[0]
  364. vals["AcY"]=xyz[1]
  365. vals["AcZ"]=xyz[2]
  366. vals["GyX"]=xyz[3]
  367. vals["GyY"]=xyz[4]
  368. vals["GyZ"]=xyz[5]
  369. return vals
  370. def Read_XYZ(self):
  371. xyz = [0, 0, 0, 0, 0, 0]
  372. raw_xyz = self.Read_Raw_XYZ()
  373. #QMI8658AccRange_8g
  374. acc_lsb_div = (1 << 12)
  375. #QMI8658GyrRange_512dps
  376. gyro_lsb_div = 64
  377. for i in range(3):
  378. xyz[i] = raw_xyz[i]/acc_lsb_div # (acc_lsb_div/1000.0)
  379. xyz[i+3] = raw_xyz[i+3]*1.0/gyro_lsb_div
  380. return xyz
  381. def get_accel(self, samples=10, calibration=None):
  382. result = {}
  383. for _ in range(samples):
  384. v = self.Read_Raw_XYZ()
  385. for m in v.keys():
  386. result[m] = result.get(m, 0) + v[m] / samples
  387. if calibration:
  388. for m in calibration.keys():
  389. if m == "AcZ":
  390. pass
  391. else:
  392. result[m] -= calibration[m]
  393. return result
  394. def calibrate(self, threshold=50):
  395. print('Calibrating QMI8658... ', end='')
  396. while True:
  397. v1 = self.get_accel(100)
  398. v2 = self.get_accel(100)
  399. if all(abs(v1[m] - v2[m]) < threshold for m in v1.keys()):
  400. print('Done.')
  401. return v1
  402. def getPitchYawRollGxGyGz(self,calibration):
  403. caliData=self.get_accel(10, calibration)
  404. pitch=caliData["AcX"]/182.04
  405. yaw=caliData["AcY"]/182.04
  406. roll=caliData["AcZ"]/182.04
  407. groX=caliData["GyX"]
  408. groY=caliData["GyY"]
  409. groZ=caliData["GyZ"]
  410. if roll<0:
  411. if pitch >=0:
  412. pitch=180-pitch
  413. elif pitch <0:
  414. pitch=(180+pitch)*(-1)
  415. if yaw >=0:
  416. yaw=180-yaw
  417. elif pitch <0:
  418. yaw=(180+yaw)*(-1)
  419. return [pitch,yaw,roll,groX,groY,groZ]
  420. ##################################
  421. # 7、STM8S #
  422. ##################################
  423. import smbus2
  424. import time
  425. class stm8s(object):
  426. bus = smbus2.SMBus(2) # 2 indicates /dev/i2c-2
  427. address = 0x50
  428. # 0x00 # 触发配置
  429. # 0x01 # 重置配置
  430. # 0x02 # pwm0 历史配置
  431. # 0x03 # pwm1 历史配置
  432. # 引脚配置模式有 1. pwm 2. gpio ouput gpio input 3. adc 4.ws2812_singe 5 ws2812_multi
  433. def __init__(self):
  434. self.reset()
  435. time.sleep(0.05)
  436. pass
  437. def clear(self):
  438. self.write(1, 1)
  439. self.reset()
  440. time.sleep(0.05)
  441. def write(self, addr, val):
  442. for i in range(0, 3):
  443. try:
  444. self.bus.write_byte_data(self.address, addr, val)
  445. time.sleep(0.001) # 1ms
  446. # print(addr, val) # debug
  447. return True
  448. except Exception:
  449. time.sleep(0.01)
  450. continue
  451. return False
  452. def fastWrite(self,addr,valBlock):
  453. try:
  454. self.bus.write_i2c_block_data(self.address,addr,valBlock)
  455. return True
  456. except Exception:
  457. return False
  458. def read(self, addr):
  459. for i in range(0, 3):
  460. try:
  461. tmp = self.bus.read_byte_data(self.address, addr)
  462. time.sleep(0.001) # 1ms
  463. # print(addr, tmp) # debug
  464. return tmp
  465. except Exception:
  466. time.sleep(0.01)
  467. continue
  468. return None
  469. def reset(self):
  470. self.write(0, 1)
  471. time.sleep(0.05) # 重启并配置需要时间
  472. def dump(self):
  473. for i in range(0, 32):
  474. print(i, self.read(i))
  475. class singleRgb(stm8s):
  476. def __init__(self):
  477. self.valR=0
  478. self.valG=0
  479. self.valB=0
  480. self.brightness=255
  481. self.show()
  482. def setColor(self,r,g,b):
  483. if(r>=0 and r<=255):
  484. self.valR=int(r*self.brightness/255)
  485. else:
  486. self.valR=0
  487. if(g>=0 and g<=255):
  488. self.valG=int(g*self.brightness/255)
  489. else:
  490. self.valG=0
  491. if(b>=0 and b<=255):
  492. self.valB=int(b*self.brightness/255)
  493. else:
  494. self.valB=0
  495. def setBrightness(self,brightness):
  496. if(brightness>=0 and brightness<=255):
  497. self.brightness=brightness
  498. else:
  499. self.brightness=0
  500. def show(self):
  501. self.write(31, self.valB)
  502. self.write(30, self.valG)
  503. self.write(29, self.valR)
  504. self.write(28, 6)
  505. class dcMotor(stm8s):
  506. def __init__(self,id):
  507. self.id=id
  508. def m1a(self,val=0):
  509. self.write(4,5) #M1A
  510. #self.write(5,0)
  511. #self.write(6,0)
  512. self.write(7,val)
  513. def m1b(self,val=0):
  514. self.write(8,5) #M1B
  515. #self.write(9,0)
  516. #self.write(10,0)
  517. self.write(11,val)
  518. def m2a(self,val=0):
  519. self.write(12,5) #M2A
  520. #self.write(13,0)
  521. #self.write(14,0)
  522. self.write(15,val)
  523. def m2b(self,val=0):
  524. self.write(16,5) #M2B
  525. #self.write(17,0)
  526. #self.write(18,0)
  527. self.write(19,val)
  528. def dcMotorCtrl(self,dir,speed):
  529. dir=1-dir
  530. if(0<speed and speed<255):
  531. if(self.id ==1): #Motor1
  532. if(dir==0):
  533. self.m1a(speed)
  534. self.m1b(255)
  535. else:
  536. self.m1a(255)
  537. self.m1b(speed)
  538. elif(self.id ==2):
  539. if(dir==0):
  540. self.m2a(speed)
  541. self.m2b(255)
  542. else:
  543. self.m2a(255)
  544. self.m2b(speed)
  545. elif(0==speed):
  546. if(self.id ==1): #Motor1
  547. if(dir==0):
  548. self.m1a(255)
  549. self.m1b(255)
  550. else:
  551. self.m1a(255)
  552. self.m1b(255)
  553. elif(self.id ==2):
  554. if(dir==0):
  555. self.m2a(255)
  556. self.m2b(255)
  557. else:
  558. self.m2a(255)
  559. self.m2b(255)
  560. elif(speed==255):
  561. if(self.id ==1): #Motor1
  562. if(dir==0):
  563. self.m1a(0)
  564. self.m1b(255)
  565. else:
  566. self.m1a(255)
  567. self.m1b(0)
  568. elif(self.id ==2):
  569. if(dir==0):
  570. self.m2a(0)
  571. self.m2b(255)
  572. else:
  573. self.m2a(255)
  574. self.m2b(0)
  575. else:
  576. pass
  577. class multiFuncGpio(stm8s):
  578. def __init__(self,id=0,mode=0):
  579. self.id=id
  580. self.rgbId=0
  581. self.brightness=255
  582. self.mode=mode
  583. self.write(20+self.id*4,self.mode)
  584. self.rgbSerial=[0,0,0]*16
  585. time.sleep(0.05)
  586. ##################################################
  587. # mode | 0 | 1 | 2 | 3 | 4 | 5 | 6 |
  588. #-------------------------------------------------
  589. # Func |free |servo|INPUT| OUT | ADC | PWM | BEEP|
  590. ##################################################
  591. # mode=0,为空闲状态,引脚不执行任何功能
  592. # mode=1,为控制舵机模式,值控制范围为0°~180°
  593. # mode=2,为数字输入模式,返回值0或1
  594. # mode=3,为数字输出模式,输出值为0或1
  595. # mode=4,为ADC采样模式,返回值为0~1023
  596. # mode=5,为PWM输出模式,输出值范围为0~255
  597. # mode=6,为控制蜂鸣器模式,控制范围为20hz~12000hz
  598. # mode=7,为控制灯带模式,暂未实现
  599. # id=0,控制多功能引脚1,向20号寄存器写入模式数据
  600. # id=1,控制多功能引脚2,向24号寄存器写入模式数据
  601. def servoCtrl(self,angle):
  602. if ((angle>=0) and (angle<=180)):
  603. self.write(23+self.id*4,angle)
  604. else:
  605. pass
  606. def digitalRead(self):
  607. try:
  608. self.gpioVal= self.read(23+ self.id*4)
  609. if(self.gpioVal != None):
  610. return self.gpioVal
  611. except:
  612. print("ERROR 233")
  613. def digitalWrite(self,val):
  614. if ((val>=0) and (val<=1)):
  615. self.write(23+self.id*4,val)
  616. else:
  617. pass
  618. def analogRead(self):
  619. try:
  620. self.adcValH= self.read(22+ self.id*4)
  621. self.adcValL= self.read(23+ self.id*4)
  622. if (self.adcValH != None and self.adcValL != None):
  623. # adcValH adcValL 大小端合并 16bit
  624. self.adcVal = self.adcValL + (self.adcValH << 8)
  625. return self.adcVal
  626. except:
  627. print("ERROR 2333")
  628. def analogWrite(self,val):
  629. if ((val>=0) and (val<=255)):
  630. self.write(23+self.id*4,val)
  631. else:
  632. pass
  633. def beep(self,frequency):
  634. if ((frequency>=20) and (frequency<=12000)):
  635. self.write(22+self.id*4,frequency>>8)
  636. self.write(23+self.id*4,frequency&0b11111111)
  637. else:
  638. pass
  639. def pixelInit_(self):
  640. for i in range(16):
  641. self.setPixelColor(i,0,0,0)
  642. self.pixelShow()
  643. self.write(23+self.id*4,1)
  644. def setBrightness(self,brightness):
  645. if(brightness>=0 and brightness<=255):
  646. self.brightness=brightness
  647. else:
  648. self.brightness=0
  649. def setPixelColor(self,rgbId,r,g,b):
  650. self.setRgbSerialColor(rgbId,r,g,b)
  651. if(rgbId >=0 and rgbId <=15):
  652. self.rgbId=rgbId #rgbId范围:0~15
  653. else:
  654. self.rgbId=0
  655. if(r>=0 and r<=255):
  656. self.valR=int(r*self.brightness/255)
  657. else:
  658. self.valR=0
  659. if(g>=0 and g<=255):
  660. self.valG=int(g*self.brightness/255)
  661. else:
  662. self.valG=0
  663. if(b>=0 and b<=255):
  664. self.valB=int(b*self.brightness/255)
  665. else:
  666. self.valB=0
  667. #self.id的值为0或1,用于控制灯带缓冲区(S1或者S2引脚)
  668. def pixelShow(self):
  669. for i in range(16):
  670. # print(f"Setting LED {i} to R:{self.rgbSerial[i*3]} G:{self.rgbSerial[i*3+1]} B:{self.rgbSerial[i*3+2]}")
  671. # time.sleep(0.05)
  672. self.write(32+ self.id*48+i*3, self.rgbSerial[i*3])
  673. # time.sleep(0.05)
  674. self.write(33+ self.id*48+i*3, self.rgbSerial[i*3+1])
  675. # time.sleep(0.05)
  676. self.write(34+ self.id*48+i*3, self.rgbSerial[i*3+2])
  677. # time.sleep(0.05)
  678. # time.sleep(0.05)
  679. self.write(23+self.id*4,1)
  680. def setRgbSerialColor(self,rgbId,r,g,b):
  681. if(rgbId >=0 and rgbId <=15):
  682. self.rgbId=rgbId #rgbId范围:0~15
  683. else:
  684. self.rgbId=0
  685. if(r>=0 and r<=255):
  686. self.valR=int(r*self.brightness/255)
  687. else:
  688. self.valR=0
  689. if(g>=0 and g<=255):
  690. self.valG=int(g*self.brightness/255)
  691. else:
  692. self.valG=0
  693. if(b>=0 and b<=255):
  694. self.valB=int(b*self.brightness/255)
  695. else:
  696. self.valB=0
  697. self.rgbSerial[self.rgbId*3]=self.valR
  698. self.rgbSerial[self.rgbId*3+1]=self.valG
  699. self.rgbSerial[self.rgbId*3+2]=self.valB
  700. def rgbSerialShow(self):
  701. self.pixelShow()
  702. ##################################
  703. # 8、UvcVideo #
  704. ##################################
  705. class UvcVideo(camera.MaixVideo):
  706. def __init__(self, source="/dev/videoX"):
  707. self.source = source
  708. super(UvcVideo, self).__init__()
  709. import os, time
  710. usb_path = '/sys/devices/platform/soc/usbc0/otg_role'
  711. # 确认 usb_path 内容为 usb_host 如果不是,自动设置为 usb_host
  712. if os.popen('cat %s' % usb_path).read().strip() != 'usb_host':
  713. os.system('echo "usb_host" > %s' % usb_path)
  714. time.sleep(2) # 要设置 2s 左右才能初始化工作,否则会报 VIDIOC_S_FMT 失败。
  715. def config(self, size=None, video=2, horizontal=0, vertical=0):
  716. if size == None:
  717. size = (320, 240)
  718. super(UvcVideo, self).config(size)
  719. print('[camera] config input size(%d, %d, %d)' %
  720. (self.width(), self.height(), video))
  721. if self.cam:
  722. self.cam = None
  723. try:
  724. import _coco_camera
  725. self.cam = _coco_camera.Camera(self.width(), self.height(), video, horizontal, vertical)
  726. except Exception as e:
  727. print(e)
  728. self.cam = None
  729. def read(self):
  730. if self.cam == None:
  731. self.config()
  732. if self.cam:
  733. ret, frame = self.cam.read()
  734. if ret:
  735. return frame # bytes
  736. else:
  737. try:
  738. self.config()
  739. except Exception as e:
  740. print(e)
  741. return None
  742. def __del__(self):
  743. if self.cam:
  744. self.cam = None
  745. ##################################
  746. # 9、DS3231 #
  747. ##################################
  748. from math import floor
  749. class DS3231(object):
  750. # create RTC instance
  751. def __init__(self):
  752. self.bus = smbus2.SMBus(2) # 2 indicates /dev/i2c-2
  753. self.address = 0x68
  754. def bcd_to_int(self,bcd, n=2):
  755. """Decode n least significant packed binary coded decimal digits to binary.
  756. Return binary result.
  757. n defaults to 2 (BCD digits).
  758. n=0 decodes all digits.
  759. """
  760. return int(('%x' % bcd)[-n:])
  761. def int_to_bcd(self,x, n=2):
  762. """
  763. Encode the n least significant decimal digits of x
  764. to packed binary coded decimal (BCD).
  765. Return packed BCD value.
  766. n defaults to 2 (digits).
  767. n=0 encodes all digits.
  768. """
  769. return int(str(x)[-n:], 0x10)
  770. def read(self, addr):
  771. for i in range(0, 3):
  772. try:
  773. tmp = self.bus.read_byte_data(self.address, addr)
  774. time.sleep(0.001) # 1ms
  775. # print(addr, tmp) # debug
  776. return tmp
  777. except Exception:
  778. time.sleep(0.01)
  779. continue
  780. return None
  781. def write(self, addr, val):
  782. for i in range(0, 3):
  783. try:
  784. self.bus.write_byte_data(self.address, addr, val)
  785. #time.sleep(0.001) # 1ms
  786. # print(addr, val) # debug
  787. return True
  788. except Exception:
  789. time.sleep(0.001)
  790. continue
  791. return False
  792. # set times functions ----------------------------------------
  793. def setYear(self, year):
  794. # only last two digits (last two digits are used if longer)
  795. self.write(0x06, self.int_to_bcd(year%100))
  796. def setMonth(self, month):
  797. if not 1 <= month <= 12:
  798. raise ValueError('Month is out of range [1,12].')
  799. self.write(0x05,self.int_to_bcd(month))
  800. def setDay(self, day):
  801. if not 1 <= day <= 31:
  802. raise ValueError('Day is out of range [1,31].')
  803. self.write(0x04,self.int_to_bcd(day))
  804. def setDayOfWeek(self, dayOfWeek):
  805. if not 1 <= dayOfWeek <= 7:
  806. raise ValueError('Day of week is out of range [1,7].')
  807. self.write(0x03,self.int_to_bcd(dayOfWeek))
  808. def setHour(self, hour):
  809. if not 0 <= hours < 24:
  810. raise ValueError('Hours is out of range [0,23].')
  811. self.write(0x02,self.int_to_bcd(hour)& 0x3F)
  812. def setMinutes(self, minutes):
  813. if not 0 <= minutes < 59:
  814. raise ValueError('Minutes is out of range [0,59].')
  815. self.write(0x01,self.int_to_bcd(minutes))
  816. def setSeconds(self, seconds):
  817. if not 0 <= seconds < 60:
  818. raise ValueError('Seconds is out of range [0,59].')
  819. self.write(0x00,self.int_to_bcd(seconds))
  820. def setDateTime(self, year, month, day, dayOfWeek, hour, minutes, seconds):
  821. # set all the date and times (year is last two digits of year)
  822. self.setYear(year)
  823. self.setMonth(month)
  824. self.setDay(day)
  825. self.setDayOfWeek(dayOfWeek)
  826. self.setHour(hour)
  827. self.setMinutes(minutes)
  828. self.setSeconds(seconds)
  829. # get times functions -------------------------------------------------
  830. def getYear(self):
  831. return self.bcd_to_int(self.read(0x06))
  832. def getMonth(self):
  833. temp = self.read(0x05)
  834. return self.bcd_to_int((temp<<4>>4) &0x7F)
  835. #return temp[0] & 0x7F
  836. def getDay(self):
  837. # 0 - 31
  838. return self.bcd_to_int(self.read(0x04))
  839. def getDayOfWeek(self):
  840. # 1 - 7
  841. return self.bcd_to_int(self.read(0x03))
  842. def getHour(self):
  843. temp = self.read(0x02)
  844. if temp==0x64: #if hour is 24:00,convert it to 00:00
  845. temp=0x40
  846. return self.bcd_to_int((temp<< 4 >>4)& 0x3F)
  847. #return temp[0] & 0x3F
  848. def getMinutes(self):
  849. return self.bcd_to_int(self.read(0x01))
  850. def getSeconds(self):
  851. return self.bcd_to_int(self.read(0x00))
  852. def getDateTime(self):
  853. # returns whole date and time as list
  854. # (last two digits of year, month, day, day of week, hour, minutes, seconds)
  855. dateTime = [0, 0, 0, 0, 0, 0, 0]
  856. dateTime[0] = self.getYear()
  857. dateTime[1] = self.getMonth()
  858. dateTime[2] = self.getDay()
  859. dateTime[3] = self.getDayOfWeek()
  860. dateTime[4] = self.getHour()
  861. dateTime[5] = self.getMinutes()
  862. dateTime[6] = self.getSeconds()
  863. return dateTime
  864. def convertToByteType(self,number):
  865. return bytes([number])
  866. def decodeToDec(self,byte):
  867. return ((byte[0] >> 4) * 10) + (byte[0] & 0x0F)
  868. def encodeToByte(self,dec):
  869. tens = floor(dec / 10)
  870. ones = dec - tens*10
  871. return (tens << 4) + ones
  872. def decodeAlarmType(self,alarmTime):
  873. if(len(alarmTime) > 4):
  874. m1Bit = (alarmTime[3] & 0x80) >> 7
  875. else:
  876. m1Bit = False
  877. m2Bit = (alarmTime[2] & 0x80) >> 7
  878. m3Bit = (alarmTime[1] & 0x80) >> 7
  879. m4Bit = (alarmTime[0] & 0x80) >> 7
  880. dayBit = (alarmTime[0] & 0x40) >> 6
  881. if(m1Bit and m2Bit and m3Bit and m4Bit):
  882. return "everySecond"
  883. elif(not m1Bit and m2Bit and m3Bit and m4Bit):
  884. return "everyMinute"
  885. elif(not m1Bit and not m2Bit and m3Bit and m4Bit):
  886. return "everyHour"
  887. elif(not m1Bit and not m2Bit and not m3Bit and m4Bit):
  888. return "everyDay"
  889. elif(not dayBit and not m1Bit and not m2Bit and not m3Bit and not m4Bit):
  890. return "everyMonth"
  891. elif(dayBit and not m1Bit and not m2Bit and not m3Bit and not m4Bit):
  892. return "everyWeek"
  893. else:
  894. return "noValidAlarmType"
  895. def decodeAlarmTime(self,alarmTime):
  896. alarmTime[0] = decodeToDec(convertToByteType(alarmTime[0] & 0x3F))
  897. alarmTime[1] = decodeToDec(convertToByteType(alarmTime[1] & 0x3F))
  898. alarmTime[2] = decodeToDec(convertToByteType(alarmTime[2] & 0x7F))
  899. if(len(alarmTime) > 4):
  900. alarmTime[3] = decodeToDec(convertToByteType(alarmTime[3] & 0x7F))
  901. return alarmTime
  902. def encodeAlarmType(self,alarmType):
  903. if(alarmType == "everySecond"):
  904. return 15 #0b01111
  905. elif(alarmType == "everyMinute"):
  906. return 14 #0b01110
  907. elif(alarmType == "everyHour"):
  908. return 12 #0b01100
  909. elif(alarmType == "everyDay"):
  910. return 8 #0b01000
  911. elif(alarmType == "everyMonth"):
  912. return 0 #0b00000
  913. elif(alarmType == "everyWeek"):
  914. return 16 #0b10000
  915. else:
  916. raise ValueError("""Not a supported alarmType. Options are:
  917. 'everySecond' (only Alarm 1), 'everyMinute', 'everyHour', 'everyDay', 'everyMonth', 'everyWeek'""")
  918. def encodeDateTime(self,day, hour, minutes, seconds, alarmType):
  919. alarmBits = encodeAlarmType(alarmType)
  920. alarmTime = [0, 0, 0, 0]
  921. alarmTime[0] = (encodeToByte(day) & 0x3F) | ((alarmBits & 0x10) << 2) | ((alarmBits & 0x08) << 4)
  922. alarmTime[1] = (encodeToByte(hour) & 0x3F) | ((alarmBits & 0x04) << 5)
  923. alarmTime[2] = (encodeToByte(minutes) & 0x7F) | ((alarmBits & 0x02) << 6)
  924. alarmTime[3] = (encodeToByte(seconds) & 0x7F) | ((alarmBits & 0x01) << 7)
  925. return alarmTime
  926. ##################################
  927. # 10、SPI_WS2812 #
  928. ##################################
  929. class SPI_WS2812(object):
  930. from maix import spi
  931. spi = spi.SpiDev()
  932. def __init__(self,num):
  933. self.num=num
  934. self.spi.open(0, 0)
  935. self.spi.mode = 3
  936. self.spi.bits_per_word = 8
  937. self.spi.max_speed_hz = 20000000
  938. self.data=[[0,0,0]]*self.num
  939. self.brightness=255
  940. def setRgbColor(self,id,r,g,b):
  941. if id>(self.num-1):
  942. raise ValueError("Out of range!")
  943. else:
  944. self.data[id]=[int(g*self.brightness/255),int(r*self.brightness/255),int(b*self.brightness/255)]
  945. #print("set complete!")
  946. def setBrightness(self,brightness):
  947. if brightness>255 or brightness<0:
  948. raise ValueError("Out of range!")
  949. self.brightness=brightness
  950. def rgbShow(self):
  951. tx=[]
  952. for rgb in self.data:
  953. for byte in rgb:
  954. for ibit in range(3,-1,-1):
  955. tx.append(((byte>>(2*ibit+1))&1)*0x60 +
  956. ((byte>>(2*ibit+0))&1)*0x06 +
  957. 0x88)
  958. print([hex(v) for v in tx])
  959. tx[0]=0b1000000
  960. tx.append(0b1000000)
  961. self.spi.xfer(tx,int(4/1.05e-6))
  962. def __del__(self):
  963. self.data=[[0,0,0]]*self.num
  964. self.rgbShow()
  965. ##################################
  966. # 11、HCSR04 #
  967. ##################################
  968. class HCSR04:
  969. def __init__(self,Trig,Echo):
  970. pinNum={"TXD":"198","RXD":"199","CLK":"224","MOSI":"225","MISO":"226","CS":"227"}
  971. os.system("insmod /home/drivers/hcsr04.ko")
  972. pinCmd=pinNum.get(Trig)+","+pinNum.get(Echo)+",23200,0"
  973. os.system('echo "'+pinCmd+'" > /sys/class/hcsr04/value')
  974. def getDistance(self):
  975. startTime=round(time.time(),3)
  976. #print("startTime:"+str(startTime))
  977. while True:
  978. dis=os.popen("cat /sys/class/hcsr04/value").read()
  979. #print("dis:"+str(dis)+" len:"+str(len(dis)))
  980. if "-1" in dis:
  981. pass
  982. else:
  983. dis=round(int(dis)/58,2)
  984. if dis<250:
  985. return dis
  986. else:
  987. pass
  988. if((round(time.time(),3)-startTime)>=1.200):#超时时间
  989. return -1
  990. def __del__(self):
  991. os.system("rmmod /home/drivers/hcsr04.ko")
  992. import struct
  993. import math
  994. import os
  995. ##################################
  996. # 12、MCP23017 #
  997. ##################################
  998. class MCP23017(object):
  999. bus = smbus2.SMBus(2) # 2 indicates /dev/i2c-2
  1000. address = 0x20
  1001. iodira=0x00 #A引脚方向寄存器地址。初始值为0xFF,输入模式
  1002. iodirb=0x01 #B引脚方向寄存器地址。初始值为0xFF,输入模式
  1003. gppua=0x0c #A引脚上拉电阻配置寄存器地址。初始值为0x00,无上拉
  1004. gppub=0x0d #B引脚上拉电阻配置寄存器地址,初始值为0x00,无上拉
  1005. gpioa=0x12 #A端口寄存器,初始值为0x00,低电平
  1006. gpiob=0x13 #B端口寄存器,初始值为0x00,低电平
  1007. DIR_A_V=0xff #A引脚方向初始值
  1008. DIR_B_V=0xff #B引脚方向初始值
  1009. GPPU_A_V=0x00 #A引脚上拉设定初始值
  1010. GPPU_B_V=0x00 #B引脚上拉设定初始值
  1011. GPIO_A_V=0x00 #A引脚电平初始值
  1012. GPIO_B_V=0x00 #B引脚电平初始值
  1013. def __init__(self):
  1014. self.reset()
  1015. def reset(self):
  1016. self.DIR_A=self.DIR_A_V
  1017. self.DIR_B=self.DIR_B_V
  1018. self.GPPU_A=self.GPPU_A_V
  1019. self.GPPU_B=self.GPPU_B_V
  1020. self.GPIO_A=self.GPIO_A_V
  1021. self.GPIO_B=self.GPIO_B_V
  1022. self.byteWrite(self.iodira,self.DIR_A_V)
  1023. self.byteWrite(self.iodirb,self.DIR_B_V)
  1024. self.byteWrite(self.gppua,self.GPPU_A_V)
  1025. self.byteWrite(self.gppub,self.GPPU_B_V)
  1026. self.byteWrite(self.gpioa,self.GPIO_A_V)
  1027. self.byteWrite(self.gpiob,self.GPIO_B_V)
  1028. print("mcp23017 reset completed!")
  1029. def byteWrite(self, addr, val):
  1030. try:
  1031. self.bus.write_byte_data(self.address, addr, val)
  1032. return True
  1033. except Exception:
  1034. pass
  1035. def byteRead(self,addr):
  1036. tmp = self.bus.read_byte_data(self.address, addr)
  1037. return tmp
  1038. def bitWrite(self,reg,num,val): #寄存器值(byte类型),寄存器第...位(0-7),该位的值(0/1)
  1039. return (reg>>(num+1)<<(num+1))|(val << num)|(reg<<(8-num)&0xFF)>>(8-num)
  1040. def bitRead(self,reg,num): #寄存器值(byte类型),寄存器第...位(0-7)
  1041. return ((reg<<(7-num)&0xFF)>>7)
  1042. def setGpioDir(self,channel,pinId,direction): #set gpio direction
  1043. #channel:"A" or "B"
  1044. #pinId:0~7
  1045. #direction:[0:output],[1:input(default)]
  1046. if channel=="A":
  1047. self.DIR_A=self.bitWrite(self.DIR_A,pinId,direction)
  1048. print("Dir_A="+str(self.DIR_A))
  1049. self.byteWrite(self.iodira,self.DIR_A)
  1050. elif channel=="B":
  1051. self.DIR_B=self.bitWrite(self.DIR_B,pinId,direction)
  1052. self.byteWrite(self.iodirb,self.DIR_B)
  1053. else:
  1054. raise ValueError("Error Channel!")
  1055. def setGppuEnable(self,channel,pinId,pullup): #set gpio pullup on or off
  1056. #channel:"A" or "B"
  1057. #pinId:0~7
  1058. #pullup:[0:disable],[1:enable(default)]
  1059. if channel=="A":
  1060. self.GPPU_A=self.bitWrite(self.GPPU_A,pinId,pullup)
  1061. self.byteWrite(self.gppua,self.GPPU_A)
  1062. elif channel=="B":
  1063. self.GPPU_B=self.bitWrite(self.GPPU_B,pinId,pullup)
  1064. self.byteWrite(self.gppub,self.GPPU_B)
  1065. else:
  1066. raise ValueError("Error Channel!")
  1067. def setGpioLevel(self,channel,pinId,level): #set gpio volt level
  1068. #channel:"A" or "B"
  1069. #pinId:0~7
  1070. #level:[0:low(default)],[1:high]
  1071. if channel=="A":
  1072. self.GPIO_A=self.bitWrite(self.GPIO_A,pinId,level)
  1073. self.byteWrite(self.gpioa,self.GPIO_A)
  1074. elif channel=="B":
  1075. self.GPIO_B=self.bitWrite(self.GPIO_B,pinId,level)
  1076. self.byteWrite(self.gpiob,self.GPIO_B)
  1077. else:
  1078. raise ValueError("Error Channel!")
  1079. def getGpioLevel(self,channel,pinId): #get gpio volt level
  1080. #channel:"A" or "B"
  1081. #pinId:0~7
  1082. #level:[0:low(default)],[1:high]
  1083. if channel=="A":
  1084. return self.bitRead(self.byteRead(self.gpioa),pinId)
  1085. elif channel=="B":
  1086. return self.bitRead(self.byteRead(self.gpiob),pinId)
  1087. else:
  1088. raise ValueError("Error Channel!")
  1089. def __del__(self):
  1090. self.reset()
  1091. time.sleep(0.001)
  1092. print("del mcp23017")
  1093. class ADS1115(object):
  1094. bus = smbus2.SMBus(2) # 2 indicates /dev/i2c-2
  1095. # Registers in the ADS1115,设备的4个寄存器
  1096. DEVICE_REG_CONVERSION = 0x00 #转换寄存器
  1097. DEVICE_REG_CONFIG = 0x01 #配置寄存器
  1098. DEVICE_REG_LO_THRESH = 0x02 #最低阈值寄存器
  1099. DEVICE_REG_HI_THRESH = 0x03 #最高阈值寄存器
  1100. # Configuration register fields #配置寄存器展开,共16bit
  1101. # Operational Status #操作状态,在第15位
  1102. CONFIG_OS = 0X8000 #无效
  1103. CONFIG_OS_START = 0X8000 #开始单次转换(处于掉电状态)
  1104. CONFIG_OS_PERFORMING_CONVERSION = 0X0000 #转换进行中
  1105. CONFIG_OS_NOT_PERFORMING_OPERATION = 0X8000 #转换闲置
  1106. # Differential measurements #测量模式设置,在第12-14位
  1107. CONFIG_MUX_AIN0P_AIN1N = 0X0000 # (default) #AIN0差分输入,AIN1作为参考
  1108. CONFIG_MUX_AIN1P_AIN3N = 0X1000 #AIN1差分输入,AIN3作为参考
  1109. CONFIG_MUX_AIN2P_AIN3N = 0X2000 #AIN2差分输入,AIN3作为参考
  1110. CONFIG_MUX_AIN3P_AIN3N = 0X3000 #AIN3差分输入,AIN3作为参考
  1111. # Single ended measurements #单端测量
  1112. CONFIG_MUX_AIN0P_GNDN = 0X4000 #AIN0单端输入
  1113. CONFIG_MUX_AIN1P_GNDN = 0X5000 #AIN1单端输入
  1114. CONFIG_MUX_AIN2P_GNDN = 0X6000 #AIN2单端输入
  1115. CONFIG_MUX_AIN3P_GNDN = 0X7000 #AIN3单端输入
  1116. # Programmable gain amplifier configuration #可编程增益放大器(量程选择)FSR:Feedback Shift Register,反馈移位寄存器,在第9-11位
  1117. CONFIG_FSR_6V144 = 0X0000 #CocoPi 需选择
  1118. CONFIG_FSR_4V096 = 0X0200
  1119. CONFIG_FSR_2V048 = 0X0400 # (default)
  1120. CONFIG_FSR_1V024 = 0X0600
  1121. CONFIG_FSR_0V512 = 0X0800
  1122. CONFIG_FSR_0V256 = 0X0A00
  1123. CONFIG_FSR_0V256 = 0X0C00
  1124. CONFIG_FSR_0V256 = 0X0E00
  1125. # Continuous or single shot mode #设备运行模式:持续转换或者单次转换,在第8位
  1126. CONFIG_MODE_CONTINUOUS = 0X0000 #持续转换
  1127. CONFIG_MODE_SINGLE_SHOT = 0X0100 # (default) #单次转换
  1128. # Data rate #转换速率,第5-7位
  1129. CONFIG_DATA_RATE_8SPS = 0X0000 #SPS:Samples Per Second,每秒8次采样
  1130. CONFIG_DATA_RATE_16SPS = 0X0020
  1131. CONFIG_DATA_RATE_32SPS = 0X0040
  1132. CONFIG_DATA_RATE_64SPS = 0X0060
  1133. CONFIG_DATA_RATE_128SPS = 0X0080 #(default)
  1134. CONFIG_DATA_RATE_2508SPS = 0X00A0
  1135. CONFIG_DATA_RATE_475SPS = 0X00C0
  1136. CONFIG_DATA_RATE_860SPS = 0X00E0
  1137. # Comparitor mode #比较器模式,第4位
  1138. CONFIG_COMP_MODE_TRADITIONAL = 0X0000 #(default) #传统比较器
  1139. CONFIG_COMP_MODE_WINDOW = 0X0010 #窗口模式
  1140. # Comparitor polarity #比较器集型,第3位,控制ALRET/RDY引脚极性
  1141. CONFIG_COMP_POL_ACTIVE_LOW = 0X0000 #(default) #低电平有效(默认)
  1142. CONFIG_COMP_POL_ACTIVE_HIGH = 0X0008 #高电平有效
  1143. # Comparitor latching #锁存比较器,第2位,该位控制ALERT/RDY引脚在被置为有效后锁存,还是在转换后处于上限和下限阈值范围内清零
  1144. CONFIG_COMP_LAT = 0X0004
  1145. CONFIG_COMP_LAT_NON_LATCHING = 0X0000 #(default) #默认不锁存
  1146. CONFIG_COMP_LAT_LATCHING = 0X0004
  1147. # comparitor queue and disable #比较器置位和禁用
  1148. CONFIG_COMP_QUE = 0X0003 #默认禁用比较器并将ALERT/RDY引脚设置为高阻抗
  1149. CONFIG_COMP_QUE_1_CONV = 0X0000 #一次转换后断言
  1150. CONFIG_COMP_QUE_2_CONV = 0X0001 #两次转换后置位
  1151. CONFIG_COMP_QUE_4_CONV = 0X0002 #四次转换后置位
  1152. CONFIG_COMP_QUE_DISABLE = 0X0003 #(default) #默认禁用比较器并将ALERT/RDY引脚设置为高阻抗
  1153. # Address for the device ,设备地址选择
  1154. #addr=0x48 # ADDR tied to GND
  1155. addr=0x49 # ADDR tied to VDD
  1156. #addr=0x4A # ADDR tied to SDA
  1157. #addr=0x4B # ADDR tied to SCL
  1158. def __init__(self):
  1159. self.address=0x49
  1160. self.config=0x0000
  1161. #time.sleep(0.05)
  1162. pass
  1163. def swap(self,val):
  1164. return (((val&0xff00)>>8)|((val&0x00ff)<<8)) #交换高8位与低8位
  1165. ###
  1166. def readAdc(self,channel):
  1167. if (channel>3) or (channel<0):
  1168. return False
  1169. self.config=(self.CONFIG_OS_START + # start conversion
  1170. #self.CONFIG_MUX_AIN0P_GNDN + # single ended conversion
  1171. ((channel+4)<<12) + # select channel
  1172. self.CONFIG_FSR_6V144 + # (5v signal)
  1173. self.CONFIG_MODE_SINGLE_SHOT + # single conversion and shutdown
  1174. self.CONFIG_DATA_RATE_128SPS + # data rate
  1175. self.CONFIG_COMP_MODE_TRADITIONAL + # comp conventional
  1176. self.CONFIG_COMP_POL_ACTIVE_LOW + # comp active low
  1177. self.CONFIG_COMP_LAT_NON_LATCHING + # comp non latching
  1178. self.CONFIG_COMP_QUE_DISABLE ) # comp disabled
  1179. ###
  1180. self.bus.write_word_data(self.address, self.DEVICE_REG_CONFIG, self.swap(self.config))
  1181. while True:
  1182. # read status (note byte swap)
  1183. status=self.swap(self.bus.read_word_data(self.address,self.DEVICE_REG_CONFIG))
  1184. #print("status:"+str(status))
  1185. # when the Operational Status is no longer performing a conversion
  1186. # we can break out of this wait loop
  1187. if (status & self.CONFIG_OS) != self.CONFIG_OS_PERFORMING_CONVERSION:
  1188. break
  1189. # read result (note byte swap)
  1190. result=self.swap(self.bus.read_word_data(self.address,self.DEVICE_REG_CONVERSION))
  1191. # return 16 bit integer A2D result for the specified channel
  1192. volt=round((result*6.144/32768),3)
  1193. return [result,volt]
  1194. class PCA9685(object):
  1195. bus=smbus2.SMBus(2)
  1196. def __init__(self,freq=400,min_us=460,max_us=2400,address=0x40,degrees=180):
  1197. self.address=address
  1198. self.period=1000000/freq
  1199. self.min_duty = self._us2duty(min_us)
  1200. self.max_duty = self._us2duty(max_us)
  1201. self.freq(freq)
  1202. self.reset()
  1203. #for i in range(0,16):
  1204. #self.duty(i,0)
  1205. print("Pca9685 init")
  1206. def write(self, addr, val):
  1207. for i in range(0, 2):
  1208. try:
  1209. self.bus.write_byte_data(self.address, addr, val)
  1210. #time.sleep(0.001) # 1ms
  1211. # print(addr, val) # debug
  1212. return True
  1213. except Exception:
  1214. time.sleep(0.001)
  1215. continue
  1216. return False
  1217. def read(self,addr):
  1218. for i in range(0, 3):
  1219. try:
  1220. tmp = self.bus.read_byte_data(self.address, addr)
  1221. #time.sleep(0.001) # 1ms
  1222. # print(addr, tmp) # debug
  1223. return tmp
  1224. except Exception:
  1225. time.sleep(0.01)
  1226. continue
  1227. return None
  1228. def reset(self):
  1229. self.write(0x00,0x00) #初始化
  1230. def freq(self,freq=None):
  1231. if freq is None:
  1232. return int(25000000.0/4096/(self.read(0xfe)-0.5))
  1233. #设定频率freq,预分频prescale=int(25000000.0 / (4096.0 * freq) + 0.5)
  1234. prescale=int(25000000.0/4096/freq+0.5)
  1235. self.write(0x00,0x10) #设定pca9685为睡眠模式
  1236. self.write(0xfe,prescale) #设定频率
  1237. self.reset()
  1238. time.sleep(0.01)
  1239. self.write(0x00,0xa1) #设定pca9685为活跃模式
  1240. def pwm(self,index,on=None,off=None): #on和off来调节PWM的占空比
  1241. if not 0<= index <=15:
  1242. raise ValueError("Pin ID out of range!")
  1243. if on is None or off is None:
  1244. data = self.bus.read_i2c_block_data(self.address,0x06+index*4,4)
  1245. return data
  1246. data= [0]*4
  1247. data[0]=int(hex(on & 0xff),16)
  1248. data[1]=int(hex((on >> 8) & 0xff),16)
  1249. data[2]=int(hex(off & 0xff),16)
  1250. data[3]=int(hex((off >> 8) & 0xff),16)
  1251. # print(data)
  1252. for i in range(0,4):
  1253. self.write(0x06+i+index*4,data[i])
  1254. def duty(self,index,value=None):
  1255. if value == None:
  1256. return self.pwm(index)
  1257. elif not 0 <= value <=4095:
  1258. raise ValueError("Out of range!")
  1259. elif value==0:
  1260. self.pwm(index,0,4096)
  1261. elif value == 4095:
  1262. self.pwm(index,4096,0)
  1263. else:
  1264. self.pwm(index,0,value)
  1265. def _us2duty(self,value):
  1266. return 4095*value/self.period
  1267. def __del__(self):
  1268. print("del pac9685")
  1269. time.sleep(1)
  1270. for i in range(0,16):
  1271. self.duty(i,0)
  1272. time.sleep(0.001)
  1273. class extDcMotor(PCA9685):
  1274. def __init__(self,motorId):
  1275. PCA9685.__init__(self)
  1276. self.motorPin=[11,12,13,10,9,8,5,6,7,4,3,2]
  1277. self.motorId=motorId
  1278. pass
  1279. def speedControl(self,speed):
  1280. self.speed=abs(speed)
  1281. if not -255<= speed<=255:
  1282. raise ValueError("Out of range!")
  1283. if self.motorId == "C":
  1284. if speed<0:
  1285. self.duty(self.motorPin[0],4095)
  1286. self.duty(self.motorPin[1],0)
  1287. self.duty(self.motorPin[2],int(self.speed*16))
  1288. else:
  1289. self.duty(self.motorPin[0],0)
  1290. self.duty(self.motorPin[1],4095)
  1291. self.duty(self.motorPin[2],int(self.speed*16))
  1292. elif self.motorId == "D":
  1293. if speed<0:
  1294. self.duty(self.motorPin[3],4095)
  1295. self.duty(self.motorPin[4],0)
  1296. self.duty(self.motorPin[5],int(self.speed*16))
  1297. else:
  1298. self.duty(self.motorPin[3],0)
  1299. self.duty(self.motorPin[4],4095)
  1300. self.duty(self.motorPin[5],int(self.speed*16))
  1301. elif self.motorId == "E":
  1302. if speed<0:
  1303. self.duty(self.motorPin[6],4095)
  1304. self.duty(self.motorPin[7],0)
  1305. self.duty(self.motorPin[8],int(self.speed*16))
  1306. else:
  1307. self.duty(self.motorPin[6],0)
  1308. self.duty(self.motorPin[7],4095)
  1309. self.duty(self.motorPin[8],int(self.speed*16))
  1310. elif self.motorId == "F":
  1311. if speed<0:
  1312. self.duty(self.motorPin[9],4095)
  1313. self.duty(self.motorPin[10],0)
  1314. self.duty(self.motorPin[11],int(self.speed*16))
  1315. else:
  1316. self.duty(self.motorPin[9],0)
  1317. self.duty(self.motorPin[10],4095)
  1318. self.duty(self.motorPin[11],int(self.speed*16))
  1319. else:
  1320. pass
  1321. def __del__(self):
  1322. if self.motorId == "C":
  1323. self.duty(self.motorPin[0],0)
  1324. self.duty(self.motorPin[1],0)
  1325. self.duty(self.motorPin[2],0)
  1326. elif self.motorId == "D":
  1327. self.duty(self.motorPin[3],0)
  1328. self.duty(self.motorPin[4],0)
  1329. self.duty(self.motorPin[5],0)
  1330. elif self.motorId == "E":
  1331. self.duty(self.motorPin[6],0)
  1332. self.duty(self.motorPin[7],0)
  1333. self.duty(self.motorPin[8],0)
  1334. elif self.motorId == "F":
  1335. self.duty(self.motorPin[9],0)
  1336. self.duty(self.motorPin[10],0)
  1337. self.duty(self.motorPin[11],0)
  1338. else:
  1339. pass
  1340. time.sleep(0.001)
  1341. class extServo(PCA9685):
  1342. def __init__(self,servoId):
  1343. PCA9685.__init__(self)
  1344. self.servoId=servoId
  1345. self.servoPin=[14,15,1,0]
  1346. self.degrees=180
  1347. pass
  1348. def position(self,degrees=None): #index:0,1,2,3
  1349. span = self.max_duty - self.min_duty
  1350. duty = self.min_duty + span * degrees / self.degrees
  1351. duty = int(min(self.max_duty, max(self.min_duty, int(duty))))
  1352. self.duty(self.servoPin[self.servoId], duty)
  1353. def release(self):
  1354. self.duty(self.servoPin[self.servoId],0)
  1355. def __del__(self):
  1356. self.duty(self.servoPin[self.servoId],0)
  1357. class extOutputPin(PCA9685):
  1358. def __init__(self):
  1359. PCA9685.__init__(self)
  1360. self.pin=[14,15,1,0]
  1361. self.pinId=0
  1362. pass
  1363. def digitalSet(self,pinId,val): #val:0/1
  1364. self.pinId=pinId
  1365. if val==0:
  1366. self.duty(self.pin[self.pinId],0)
  1367. else:
  1368. self.duty(self.pin[self.pinId],4095)
  1369. def pwmWrite(self,pinId,val): #val:0~255
  1370. self.pinId=pinId
  1371. # print("pinid"+str(self.pin[self.pinId]))
  1372. self.duty(self.pin[self.pinId],val*16)
  1373. def __del__(self):
  1374. self.duty(self.pin[self.pinId],0)
  1375. # print("del extPin")
  1376. class extGpio(MCP23017,ADS1115,extOutputPin):
  1377. def __init__(self):
  1378. MCP23017.__init__(self)
  1379. ADS1115.__init__(self)
  1380. extOutputPin.__init__(self)
  1381. self.address=0x20 #初始默认为mcp23017的地址
  1382. def pinMode(self,pinId,mode): #控制mcp23017
  1383. self.address=0x20
  1384. #----------
  1385. #pinId:
  1386. #p0~p3:0~3
  1387. #a0~a3:4~7
  1388. #---------
  1389. #mode:
  1390. #output:1
  1391. #input:0
  1392. if pinId>=0 and pinId<=3:
  1393. if mode==0:
  1394. if pinId==0: #p0
  1395. self.setGpioDir("B",2,0) #output
  1396. self.setGpioLevel("B",2,1) #high
  1397. self.setGpioDir("B",3,1) #input
  1398. elif pinId==1: #p1
  1399. self.setGpioDir("B",1,0)
  1400. self.setGpioLevel("B",1,1)
  1401. self.setGpioDir("B",0,1)
  1402. elif pinId==2: #p2
  1403. self.setGpioDir("B",6,0)
  1404. self.setGpioLevel("B",6,1)
  1405. self.setGpioDir("A",1,1)
  1406. elif pinId==3: #p3
  1407. self.setGpioDir("B",5,0)
  1408. self.setGpioLevel("B",5,1)
  1409. self.setGpioDir("B",4,1)
  1410. else:
  1411. pass
  1412. elif mode==1:
  1413. if pinId==0:
  1414. self.setGpioDir("B",2,0) #output
  1415. self.setGpioLevel("B",2,1) #high
  1416. self.setGpioDir("B",3,0) #output
  1417. elif pinId==1:
  1418. self.setGpioDir("B",1,0)
  1419. self.setGpioLevel("B",1,1)
  1420. self.setGpioDir("B",0,0)
  1421. elif pinId==2:
  1422. self.setGpioDir("B",6,0)
  1423. self.setGpioLevel("B",6,1)
  1424. self.setGpioDir("A",1,0)
  1425. elif pinId==3:
  1426. self.setGpioDir("B",5,0)
  1427. self.setGpioLevel("B",5,1)
  1428. self.setGpioDir("B",4,0)
  1429. # print("a")
  1430. time.sleep(1)
  1431. else:
  1432. pass
  1433. else:
  1434. pass
  1435. elif pinId>=4 and pinId<=7:
  1436. if mode==0:
  1437. if pinId==4: #a0
  1438. self.setGpioDir("A",4,0) #output
  1439. self.setGpioLevel("A",4,1) #high
  1440. self.setGpioDir("A",5,1) #input
  1441. elif pinId==5: #a1
  1442. self.setGpioDir("A",3,0)
  1443. self.setGpioLevel("A",3,1)
  1444. self.setGpioDir("A",7,1)
  1445. elif pinId==6: #a2
  1446. self.setGpioDir("A",2,0)
  1447. self.setGpioLevel("A",2,1)
  1448. self.setGpioDir("A",6,1)
  1449. elif pinId==7: #a3
  1450. self.setGpioDir("B",7,0)
  1451. self.setGpioLevel("B",7,1)
  1452. self.setGpioDir("A",0,1)
  1453. else:
  1454. pass
  1455. elif mode==1:
  1456. if pinId==4: #a0
  1457. self.setGpioDir("A",4,0) #output
  1458. self.setGpioLevel("A",4,1) #high
  1459. self.setGpioDir("A",5,0) #output
  1460. elif pinId==5: #a1
  1461. self.setGpioDir("A",3,0)
  1462. self.setGpioLevel("A",3,1)
  1463. self.setGpioDir("A",7,0)
  1464. elif pinId==6: #a2
  1465. self.setGpioDir("A",2,0)
  1466. self.setGpioLevel("A",2,1)
  1467. self.setGpioDir("A",6,0)
  1468. elif pinId==7: #a3
  1469. self.setGpioDir("B",7,0)
  1470. self.setGpioLevel("B",7,1)
  1471. self.setGpioDir("A",0,0)
  1472. else:
  1473. pass
  1474. else:
  1475. pass
  1476. def digitalWrite(self,pinId,level): #控制mcp23017
  1477. #----------
  1478. #pinId:
  1479. #p0~p3:0~3
  1480. #a0~a3:4~7
  1481. #---------
  1482. #level:
  1483. #5v:1
  1484. #0v:0
  1485. self.address=0x20
  1486. if pinId>=0 and pinId<=3:
  1487. if pinId==0:
  1488. # print("digital write level")
  1489. self.setGpioLevel("B",3,level)
  1490. elif pinId==1:
  1491. self.setGpioLevel("B",0,level)
  1492. elif pinId==2:
  1493. self.setGpioLevel("A",1,level)
  1494. elif pinId==3:
  1495. self.setGpioLevel("B",4,level)
  1496. else:
  1497. pass
  1498. elif pinId>=4 and pinId<=7:
  1499. if pinId==4: #a0
  1500. self.setGpioLevel("A",5,level)
  1501. elif pinId==5: #a1
  1502. self.setGpioLevel("A",7,level)
  1503. elif pinId==6: #a2
  1504. self.setGpioLevel("A",6,level)
  1505. elif pinId==7: #a3
  1506. self.setGpioLevel("A",0,level)
  1507. else:
  1508. pass
  1509. else:
  1510. pass
  1511. def digitalRead(self,pinId): #控制mcp23017
  1512. self.address=0x20
  1513. #----------
  1514. #pinId:
  1515. #p0~p3:0~3
  1516. #a0~a3:4~7
  1517. if pinId>=0 and pinId<=3:
  1518. if pinId==0:
  1519. # print("get digital write level")
  1520. return self.getGpioLevel("B",3)
  1521. elif pinId==1:
  1522. return self.getGpioLevel("B",0)
  1523. elif pinId==2:
  1524. return self.getGpioLevel("A",1)
  1525. elif pinId==3:
  1526. return self.getGpioLevel("B",4)
  1527. else:
  1528. pass
  1529. elif pinId>=4 and pinId<=7:
  1530. if pinId==4: #a0
  1531. return self.getGpioLevel("A",5)
  1532. elif pinId==5: #a1
  1533. return self.getGpioLevel("A",7)
  1534. elif pinId==6: #a2
  1535. return self.getGpioLevel("A",6)
  1536. elif pinId==7: #a3
  1537. return self.getGpioLevel("A",0)
  1538. else:
  1539. pass
  1540. else:
  1541. pass
  1542. def analogWrite(self,pinId,pwm): #控制PCA9685,但是需要Mcp23017进行通道选择
  1543. self.address=0x20 #先用mcp23017进行通道选择
  1544. #select X channel
  1545. if pinId==0: #p0
  1546. self.setGpioDir("B",2,1) #output
  1547. self.setGpioLevel("B",2,0) #low
  1548. elif pinId==1: #p1
  1549. self.setGpioDir("B",1,1)
  1550. self.setGpioLevel("B",1,0)
  1551. elif pinId==2: #p2
  1552. self.setGpioDir("B",6,1)
  1553. self.setGpioLevel("B",6,0)
  1554. elif pinId==3: #p3
  1555. self.setGpioDir("B",5,1)
  1556. self.setGpioLevel("B",5,0)
  1557. else:
  1558. pass
  1559. self.address=0x40 #再用PCA9685进行控制
  1560. self.pwmWrite(pinId,pwm)
  1561. def analogRead(self,pinId): #控制ADS1115,但是需要Mcp23017进行通道选择
  1562. self.adcPin=[3,1,0,2]
  1563. self.address=0x20 #先用mcp23017进行通道选择
  1564. #select X channel
  1565. if pinId==4: #a0
  1566. self.setGpioDir("A",4,1) #input
  1567. self.setGpioLevel("A",4,0) #low
  1568. elif pinId==5: #a1
  1569. self.setGpioDir("A",3,1)
  1570. self.setGpioLevel("A",3,0)
  1571. elif pinId==6: #a2
  1572. self.setGpioDir("A",2,1)
  1573. self.setGpioLevel("A",2,0)
  1574. elif pinId==7: #a3
  1575. self.setGpioDir("B",7,0)
  1576. self.setGpioLevel("B",7,0)
  1577. else:
  1578. pass
  1579. self.address=0x49 #再用Ads1115进行ADC读取
  1580. return self.readAdc(self.adcPin[pinId-4])
  1581. def __del__(self):
  1582. self.address=0x40
  1583. extOutputPin.__del__(self)
  1584. self.address=0x20
  1585. MCP23017.__del__(self) #最先init的配置最后再del
  1586. print("del finished!")