26-09-2013, 14:34:18
Utilisation d'un dispositif d'affichage LED SURE3208 (32 X 256 Leds) controlé par un circuit HT1632C interfacé en SPI. J'y met actuellement une touche finale:
- j'ai commandé un convertisseur de niveau pour finaliser mon projet: la logique du PI est en 3,3 V , le Sure3208 fonctionne en 5V (ce qui pose problème si je lis la mémoire du dispositif d'affichage).
- Je dois contrôler l'intensité lumineuse des led en fonction de la luminosité ambiante; j'ai découvert le "Convertisseur de lumiére en fréquence TSL235R SFE" qui me permetterai de mesurer l'intensité lumineuse ambiante.
Mais:
Finalement, j'ai rencontré quelques pb avec le TSL235R : il fonctionne trop bien! la fréquence est trop élevée en pleine lumière et dépasse les capacités du Raspberrypi; pas grave, je vais me rabattre sur quelque chose de plus classique.
Je me passe également du convertisseur de niveau; je ne fais qu'envoyer une commande au HT1632C et ne reçois à priori aucun signal en 5v.
Vu la simplicité de l'interface entre le PI (SPI), j'utilise finalement uniquement les bibliothèques linux standard linux/spi/spidev et sys/ioctl ; je me passe des bibliothèques bcm2835 et wiringpi;
(extrait du code C++)
[ins]void
RASPI_SPI::init_spi() {
fd = open(string("/dev/spidev0.0").c_str(), O_RDWR);
if (fd<0) {
throw SPIException("Ouverture /dev/spidev0.0 impossible" );
}
if (ioctl(fd, SPI_IOC_WR_MODE, &mode)<0) {
throw SPIException("SPI_IOC_WR_MODE");
}
if(ioctl(fd, SPI_IOC_WR_BITS_PER_WORD, &bitsPerWord) < 0) {
throw SPIException("SPI_IOC_WR_BITS_PER_WORD");
}
if(ioctl(fd, SPI_IOC_RD_BITS_PER_WORD, &bitsPerWord) < 0) {
throw SPIException("SPI_IOC_RD_BITS_PER_WORD");
}
if(ioctl(fd, SPI_IOC_WR_MAX_SPEED_HZ, &speed) < 0) {
throw SPIException("SPI_IOC_WR_MAX_SPEED_HZ");
}
if(ioctl(fd, SPI_IOC_RD_MAX_SPEED_HZ, &speed) < 0) {
throw SPIException("SPI_IOC_RD_MAX_SPEED_HZ");
}
}[/ins]
et pour écrire une commande via le SPI
[ins]
void
RASPI_SPI::Write(unsigned char *data, int lg) {
if (write(fd, data, lg) < 1) {
throw SPIException("Write");
}
}
[/ins]
Si cela intéresse quelqu'un je publierai l'ensemble du code et le schéma de cablage.
- j'ai commandé un convertisseur de niveau pour finaliser mon projet: la logique du PI est en 3,3 V , le Sure3208 fonctionne en 5V (ce qui pose problème si je lis la mémoire du dispositif d'affichage).
- Je dois contrôler l'intensité lumineuse des led en fonction de la luminosité ambiante; j'ai découvert le "Convertisseur de lumiére en fréquence TSL235R SFE" qui me permetterai de mesurer l'intensité lumineuse ambiante.
Mais:
Finalement, j'ai rencontré quelques pb avec le TSL235R : il fonctionne trop bien! la fréquence est trop élevée en pleine lumière et dépasse les capacités du Raspberrypi; pas grave, je vais me rabattre sur quelque chose de plus classique.
Je me passe également du convertisseur de niveau; je ne fais qu'envoyer une commande au HT1632C et ne reçois à priori aucun signal en 5v.
Vu la simplicité de l'interface entre le PI (SPI), j'utilise finalement uniquement les bibliothèques linux standard linux/spi/spidev et sys/ioctl ; je me passe des bibliothèques bcm2835 et wiringpi;
(extrait du code C++)
[ins]void
RASPI_SPI::init_spi() {
fd = open(string("/dev/spidev0.0").c_str(), O_RDWR);
if (fd<0) {
throw SPIException("Ouverture /dev/spidev0.0 impossible" );
}
if (ioctl(fd, SPI_IOC_WR_MODE, &mode)<0) {
throw SPIException("SPI_IOC_WR_MODE");
}
if(ioctl(fd, SPI_IOC_WR_BITS_PER_WORD, &bitsPerWord) < 0) {
throw SPIException("SPI_IOC_WR_BITS_PER_WORD");
}
if(ioctl(fd, SPI_IOC_RD_BITS_PER_WORD, &bitsPerWord) < 0) {
throw SPIException("SPI_IOC_RD_BITS_PER_WORD");
}
if(ioctl(fd, SPI_IOC_WR_MAX_SPEED_HZ, &speed) < 0) {
throw SPIException("SPI_IOC_WR_MAX_SPEED_HZ");
}
if(ioctl(fd, SPI_IOC_RD_MAX_SPEED_HZ, &speed) < 0) {
throw SPIException("SPI_IOC_RD_MAX_SPEED_HZ");
}
}[/ins]
et pour écrire une commande via le SPI
[ins]
void
RASPI_SPI::Write(unsigned char *data, int lg) {
if (write(fd, data, lg) < 1) {
throw SPIException("Write");
}
}
[/ins]
Si cela intéresse quelqu'un je publierai l'ensemble du code et le schéma de cablage.