Outils pour utilisateurs

Outils du site


raspberry_pi:controle_led_rgb

Différences

Ci-dessous, les différences entre deux révisions de la page.

Lien vers cette vue comparative

Les deux révisions précédentes Révision précédente
Dernière révision Les deux révisions suivantes
raspberry_pi:controle_led_rgb [22/02/2015 05:14]
sky99
raspberry_pi:controle_led_rgb [22/02/2015 05:15]
sky99
Ligne 109: Ligne 109:
 La différence c'est qu'​ici,​ pour allumer une couleur, il faudra mettre le GPIO correspondant à 0. La différence c'est qu'​ici,​ pour allumer une couleur, il faudra mettre le GPIO correspondant à 0.
 Si le GPIO est à 0, il est à 0V. Donc, le courant entre par l'​anode a +3.3V, cela fait une tension de 3.3V au bornes de la DEL. En revanche, si on met le GPIO à 1, il sera à 3.3V. Ce qui fait qu'a chaque borne de la DEL, on a du +3.3V. du coup la tension aux bornes de celle ci est de 0V, et elle reste éteinte! Si le GPIO est à 0, il est à 0V. Donc, le courant entre par l'​anode a +3.3V, cela fait une tension de 3.3V au bornes de la DEL. En revanche, si on met le GPIO à 1, il sera à 3.3V. Ce qui fait qu'a chaque borne de la DEL, on a du +3.3V. du coup la tension aux bornes de celle ci est de 0V, et elle reste éteinte!
-Le code est donc inversé, puisqu'​il faut passer le GPIO à 0 pour allumer, et à 1 pour éteindre:+Le code est donc inversé, puisqu'​il faut passer le GPIO à 0 pour allumer, et à 1 pour éteindre.
  
-<file python colorChangeCC.py > 
-#​!/​usr/​bin/​python 
-from Adafruit_I2C import Adafruit_I2C 
-import smbus 
-import time 
-MCP23017_IODIRA = 0x00 
-MCP23017_IODIRB = 0x01 
-MCP23017_GPIOA ​ = 0x12 
-MCP23017_GPIOB ​ = 0x13 
-MCP23017_GPPUA ​ = 0x0C 
-MCP23017_GPPUB ​ = 0x0D 
-MCP23017_OLATA ​ = 0x14 
-MCP23017_OLATB ​ = 0x15 
-MCP23008_GPIOA ​ = 0x09 
-MCP23008_GPPUA ​ = 0x06 
-MCP23008_OLATA ​ = 0x0A 
-class Adafruit_MCP230XX(object):​ 
- OUTPUT = 0 
- INPUT = 1 
- def __init__(self,​ address, num_gpios, busnum = 0): 
- assert num_gpios >= 0 and num_gpios <= 16, "​Number of GPIOs must be between 0 and 16" 
- self.i2c = Adafruit_I2C(address=address,​ bus=smbus.SMBus(busnum))  
- self.address = address 
- self.num_gpios = num_gpios 
- # set defaults 
- if num_gpios <= 8: 
- self.i2c.write8(MCP23017_IODIRA,​ 0xFF)  # all inputs on port A 
- self.direction = self.i2c.readU8(MCP23017_IODIRA) 
- self.i2c.write8(MCP23008_GPPUA,​ 0x00) 
- elif num_gpios > 8 and num_gpios <= 16: 
- self.i2c.write8(MCP23017_IODIRA,​ 0xFF)  # all inputs on port A 
- self.i2c.write8(MCP23017_IODIRB,​ 0xFF)  # all inputs on port B 
- self.direction = self.i2c.readU8(MCP23017_IODIRA) 
- self.direction |= self.i2c.readU8(MCP23017_IODIRB) << 8 
- self.i2c.write8(MCP23017_GPPUA,​ 0x00) 
- self.i2c.write8(MCP23017_GPPUB,​ 0x00) 
-  ​ 
- def _changebit(self,​ bitmap, bit, value): 
- assert value == 1 or value == 0, "Value is %s must be 1 or 0" % value 
- if value == 0: 
- return bitmap & ~(1 << bit) 
- elif value == 1: 
- return bitmap | (1 << bit) 
- def _readandchangepin(self,​ port, pin, value, currvalue = None): 
- assert pin >= 0 and pin < self.num_gpios,​ "Pin number %s is invalid, only 0-%s are valid" % (pin, self.num_gpios) 
- #assert self.direction & (1 << pin) == 0, "Pin %s not set to output"​ % pin 
- if not currvalue: 
- currvalue = self.i2c.readU8(port) 
- newvalue = self._changebit(currvalue,​ pin, value) 
- self.i2c.write8(port,​ newvalue) 
- return newvalue 
- 
- def pullup(self,​ pin, value): 
- if self.num_gpios <= 8: 
- return self._readandchangepin(MCP23008_GPPUA,​ pin, value) 
- if self.num_gpios <= 16: 
- if (pin < <img src='​http://​forum.pcinpact.com/​public/​style_emoticons/<#​EMO_DIR#>/​lunettes1.gif'​ class='​bbc_emoticon'​ alt='​8)'​ />/>/>/>/>/>/>:​ 
- return self._readandchangepin(MCP23017_GPPUA,​ pin, value) 
- else: 
- return self._readandchangepin(MCP23017_GPPUB,​ pin-8, value) 
- # Set pin to either input or output mode 
- def config(self,​ pin, mode):​   ​ 
- if self.num_gpios <= 8: 
- self.direction = self._readandchangepin(MCP23017_IODIRA,​ pin, mode) 
- if self.num_gpios <= 16: 
- if (pin < <img src='​http://​forum.pcinpact.com/​public/​style_emoticons/<#​EMO_DIR#>/​lunettes1.gif'​ class='​bbc_emoticon'​ alt='​8)'​ />/>/>/>/>/>/>:​ 
- self.direction = self._readandchangepin(MCP23017_IODIRA,​ pin, mode) 
- else: 
- self.direction = self._readandchangepin(MCP23017_IODIRB,​ pin-8, mode) 
- return self.direction 
- def output(self,​ pin, value): 
- # assert self.direction & (1 << pin) == 0, "Pin %s not set to output"​ % pin 
- if self.num_gpios <= 8: 
- self.outputvalue = self._readandchangepin(MCP23008_GPIOA,​ pin, value, self.i2c.readU8(MCP23008_OLATA)) 
- if self.num_gpios <= 16: 
- if (pin < <img src='​http://​forum.pcinpact.com/​public/​style_emoticons/<#​EMO_DIR#>/​lunettes1.gif'​ class='​bbc_emoticon'​ alt='​8)'​ />/>/>/>/>/>/>:​ 
- self.outputvalue = self._readandchangepin(MCP23017_GPIOA,​ pin, value, self.i2c.readU8(MCP23017_OLATA)) 
- else: 
- self.outputvalue = self._readandchangepin(MCP23017_GPIOB,​ pin-8, value, self.i2c.readU8(MCP23017_OLATB)) 
- return self.outputvalue 
- 
- self.outputvalue = self._readandchangepin(MCP23017_IODIRA,​ pin, value, self.outputvalue) 
- return self.outputvalue 
-   ​ 
- def input(self, pin): 
- assert pin >= 0 and pin < self.num_gpios,​ "Pin number %s is invalid, only 0-%s are valid" % (pin, self.num_gpios) 
- assert self.direction & (1 << pin) != 0, "Pin %s not set to input" % pin 
- if self.num_gpios <= 8: 
- value = self.i2c.readU8(MCP23008_GPIOA) 
- elif self.num_gpios > 8 and self.num_gpios <= 16: 
- value = self.i2c.readU16(MCP23017_GPIOA) 
- temp = value >> 8 
- value <<= 8 
- value |= temp 
- return value & (1 << pin) 
-def readU8(self):​ 
-  result = self.i2c.readU8(MCP23008_OLATA) 
-  return(result) 
-def readS8(self):​ 
-  result = self.i2c.readU8(MCP23008_OLATA) 
-  if (result > 127): result -= 256 
-  return result 
-def readU16(self):​ 
-  assert self.num_gpios >= 16, "​16bits required"​ 
-  lo = self.i2c.readU8(MCP23017_OLATA) 
-  hi = self.i2c.readU8(MCP23017_OLATB) 
-  return((hi << <img src='​http://​forum.pcinpact.com/​public/​style_emoticons/<#​EMO_DIR#>/​lunettes1.gif'​ class='​bbc_emoticon'​ alt='​8)'​ />/>/>/>/>/>/>​ | lo) 
-def readS16(self):​ 
-  assert self.num_gpios >= 16, "​16bits required"​ 
-  lo = self.i2c.readU8(MCP23017_OLATA) 
-  hi = self.i2c.readU8(MCP23017_OLATB) 
-  if (hi > 127): hi -= 256 
-  return((hi << <img src='​http://​forum.pcinpact.com/​public/​style_emoticons/<#​EMO_DIR#>/​lunettes1.gif'​ class='​bbc_emoticon'​ alt='​8)'​ />/>/>/>/>/>/>​ | lo) 
-def write8(self,​ value): 
-  self.i2c.write8(MCP23008_OLATA,​ value) 
-def write16(self,​ value): 
-  assert self.num_gpios >= 16, "​16bits required"​ 
-  self.i2c.write8(MCP23017_OLATA,​ value & 0xFF) 
-  self.i2c.write8(MCP23017_OLATB,​ (value >> <img src='​http://​forum.pcinpact.com/​public/​style_emoticons/<#​EMO_DIR#>/​lunettes1.gif'​ class='​bbc_emoticon'​ alt='​8)'​ />/>/>/>/>/>/>​ & 0xFF)   ​ 
-# RPi.GPIO compatible interface for MCP23017 and MCP23008 
-class MCP230XX_GPIO(object):​ 
- OUT = 0 
- IN = 1 
- BCM = 0 
- BOARD = 0 
- def __init__(self,​ busnum, address, num_gpios): 
- self.chip = Adafruit_MCP230XX(busnum,​ address, num_gpios) 
- def setmode(self,​ mode): 
- # do nothing 
- pass 
- def setup(self, pin, mode): 
- self.chip.config(pin,​ mode) 
- def input(self, pin): 
- return self.chip.input(pin) 
- def output(self,​ pin, value): 
- self.chip.output(pin,​ value) 
- def pullup(self,​ pin, value): 
- self.chip.pullup(pin,​ value) 
-   ​ 
-def lightRGBLed(rState,​gState,​bState,​rPin,​gPin,​bPin):​ 
- mcp.output(rPin,​ rState) 
- mcp.output(gPin,​ gState) 
- mcp.output(bPin,​ bState) 
- 
-def lightRGBLed2(color,​rPin,​gPin,​bPin):​ 
- if color == '​red':​ 
- lightRGBLed(0,​1,​1,​rPin,​gPin,​bPin) 
- elif color == '​green':​ 
- lightRGBLed(1,​0,​1,​rPin,​gPin,​bPin) 
- elif color == '​blue':​ 
- lightRGBLed(1,​1,​0,​rPin,​gPin,​bPin) 
- elif color == '​yellow':​ 
- lightRGBLed(0,​0,​1,​rPin,​gPin,​bPin) 
- elif color == '​magenta':​ 
- lightRGBLed(0,​1,​0,​rPin,​gPin,​bPin) 
- elif color == '​cyan':​ 
- lightRGBLed(1,​0,​0,​rPin,​gPin,​bPin) 
- elif color == '​white':​ 
- lightRGBLed(0,​0,​0,​rPin,​gPin,​bPin) 
-  ​ 
-if __name__ == '​__main__':​ 
- mcp = Adafruit_MCP230XX(busnum = 1, address = 0x20, num_gpios = 16) 
- r1=10 
- g1=8 
- b1=9 
- mcp.config(b1,​ mcp.OUTPUT) 
- mcp.config(g1,​ mcp.OUTPUT) 
- mcp.config(r1,​ mcp.OUTPUT) 
- while (True): 
- 
-   print "​off"​ 
-   lightRGBLed(1,​1,​1,​r1,​g1,​b1) 
-   time.sleep(1) 
-  ​ 
-   print "​rouge"​ 
-   lightRGBLed(0,​1,​1,​r1,​g1,​b1) 
-   time.sleep(1) 
-  ​ 
-  ​ 
-   print "​vert"  ​ 
-   lightRGBLed(1,​0,​1,​r1,​g1,​b1) 
-   time.sleep(1) 
- 
-   print "​bleu"​ 
-   lightRGBLed(1,​1,​0,​r1,​g1,​b1) 
-   time.sleep(1) 
-   print "​vert+bleu"  ​ 
-   lightRGBLed(1,​0,​0,​r1,​g1,​b1) 
-   time.sleep(1) 
-   print "​rouge+bleu"  ​ 
-   lightRGBLed(0,​1,​0,​r1,​g1,​b1) 
-   time.sleep(1) 
-   print "​rouge+vert"  ​ 
-   lightRGBLed(0,​0,​1,​r1,​g1,​b1) 
-   time.sleep(1) 
-   print "​rouge+vert+bleu"  ​ 
-   lightRGBLed(0,​0,​0,​r1,​g1,​b1) 
-   time.sleep(1) 
-</​file>​ 
  
  
raspberry_pi/controle_led_rgb.txt · Dernière modification: 22/02/2015 05:16 par sky99