Développeur Web RoR

Aller au contenu | Aller au menu | Aller à la recherche

mardi 9 mai 2017

Faire un timelapse avec un raspberrypi et une lampe commandée par un relais


Ok j'ai craqué, certe un peu plus tard que tout le monde mais j'ai craqué : j'ai acheté un raspberrypi. A la base je compte faire un photomaton mais j'ai pas mal d'autres projets avec le raspberry.

Bref rentrons dans le vif du sujet.

Déjà voici la liste du matériel :

Un raspberry pi 3 model B

L'alimentation du RPI avec radiateur passif et boitier plexi

Un relais (pour les noobs comme moi, un relais est un interrupteur contrôlable électroniquement (voir ici https://www.astuces-pratiques.fr/electronique/le-relais-principe-de-fonctionnement)

La camera PI v2 8mpx

Il faut également ça mais vous avez peut-être déjà ça chez vous...

Un transformateur 12v DC (que vous n'utilisez plus...)

Une lampe 12v gu5.3 led (les spots halogènes en led)

Des fils/cables breadboard

Des douilles gu5.3

Voici j'ai été exhaustif...

Pour le montage :

SCHEMA

On alimente le relais (pour voir l'allume de mon relais cliquez sur le lien du relais dans la liste au dessus) :

- le "5v" du RPI (le 1er cercle bleu sur l'image) sur le DC+ du relais 

- le "ground" du RPI (le 2nd cercle bleu sur l'image) sur le DC- du relais

- un troisième fils pour commander le relais (IN sur le relais) et sur le RPI le GPIO 12 (le 3ème cercle bleu sur l'image).

Le principe c'est que lorsque le raspberry enverra du courant dans ce 3ème fils le relais va s'activer (on lit souvent le terme "coller" sur internet) laissant ainsi passer le courant dans le second circuit électrique. Il y a donc deux circuits différents.

Le second circuit est très simple : on branche la lampe gu5.2 led au transformateur (essayez déjà ce circuit seul...). On intercale le relais qui sera l'interrupteur du circuit.

Vous noterez qu'il y a 6 connecteurs et non 5 comme sur tous les schémas mis plus haut : ce relais permet ici d'utiliser le fait que lors que l'interrupteur est ouvert (le courant ne passe pas), l'autre connecteur (noté NC) est fermé. Ça peut avoir une utilitée mais pas pour nous. Nous connectons donc le "+" du transformateur à la lampe, de la lampe à COM du relais et NO au "-" du transformateur.

J'aime bien tout faire en ruby. Alors j'ai cherché comment controller les GPIO du raspberry en ruby.

J'ai trouvé deux projets pour cela : pi_piper et rpi_gpio, j'ai choisi rpi_gpio, le truc qui m'a fait choisir c'est le fait de choisir le type de numérotation des PINS gpio soit physique (les numéros écrit sur fond vert ci-dessus) soit électronique (les numéros écrit en italique ci-dessus).

Bref donc voilà le script :

Personnellement j'ai mis mon ici dans /home/pi/rivsc/photoflash/photoflash.rb (/home/pi/rivsc/ étant le répertoire dans lequel je mets tous les scripts que je teste sur le RPI.

Donc le principe est qu'on envoie le signale au relais, le circuit de la lampe se ferme, la lampe s'allume. On prend une photo avec raspistill (l'utilitaire pour prendre des photos sur le raspberry). Puis on coupe le relais en cessant de lui envoyer du courant sur le 3ème fils.

Le must c'est de ne pas reste derrière le raspberry.

Donc on va mettre en place des tâches planifiées via cron :

crontab -e

A la fin de toutes les lignes de commentaire (qui commence pas des #) mettez ceci :

*/10 * * * * cd /home/pi/rivsc/photoflash/ && ruby photoflash.rb

Cette ligne signifie que le script sera lancer toutes les 10 minutes (*/10 : pour toutes les heures toutes les 10 minutes).

Bon ça c'est la théorie, le problème c'est que les gems GPIO ne fonctionne pas avec la version de ruby installée. On va donc réinstaller ruby avec rvm, mais il faut au préalable : git et curl. Lancez donc un terminal puis :

sudo aptitude install git curl

Installer rvm (la ligne de code vient du site officiel https://rvm.io), ça va prendre un peu de temps... donc toujours dans un terminal :

\curl -sSL https://get.rvm.io | bash -s stable

Installer le gem rpi_gpio, dans un terminal :

gem install rpi_gpio

Fermer vos terminaux et relancez-en un, il faut faire une manipulation pour utiliser le ruby rvm avec cron :

rvm cron setup

Maintenant ça devrait fonctionner !

Si vous souhaitez tester le script sans attendre 10 minutes pour prendre la photo :

cd /home/pi/rivsc/photoflash && ruby photoflash.rb

S'il y a un problème ou une coquille dans l'article, interpelez-moi sur twitter : @rivsc57

mercredi 3 août 2016

Ruby hash et struct ils ont chacun leur cas d'utilisation

Si vous utilisez les hash pour stocker tout et n'importe quoi, vous allez perdre en performance. L'intérêt d'un hash est comme il se définit d'ailleurs un tableau indexé. Il vous permet de trouver (rechercher) un enregistrement par sa clé.

Si vous avez besoin de faire un cache local des utilisateurs d'un système par exemple le hash est bien adapté !

users = {}

# Stocke les utilisateurs dans un hash avec pour index la clé primaire de l'utilisateur : id

User.all.each{ |u| users[u.id] = u }

Par contre si vous avez besoin de stocker des infos d'un contact (nom, prénom, age, ...), c'est à dire une liste finie et connue de clé, il vaut mieux utiliser un struct :

# Ce qu'il ne faut pas faire

user = { :name => "MON NOM", :email => "bla@gmail.com" }

# Ce qu'il faut faire

U = Struct.new(:name, :email)

user = U.new("MON NOM", "bla@gmail.com")

Apparemment les struct seraient à peu près 100 fois plus performant que les hash. Donc pour résumer si les clés sont connues à l'avance utilisez des Structs.

lundi 1 août 2016

Rails Panel

C'est pas tout récent mais je viens de découvrir : rails panel.

Il s'agit d'un extension chrome bien pratique pour les développeurs rails. Elle rajoute un onglet à l'inspecteur d'élément de chrome. Dans cet onglet on peut y voir les requêtes ActiveRecord, les renders, le cache.

Pratique pour débugger ou optimiser. Sur de grosses applications ça n'a pas l'air hyper-stable mais bon, ça peut sauver la vie dans certains cas.

Source : https://github.com/dejan/rails_panel

mardi 19 juillet 2016

Postman : l'extension chrome pour faire le plein de requête

Quand vous avez besoin de simuler des requêtes, vous pouvez le faire avec curl mais ce n'est pas pratique.
Postman est une extension chrome qui permet de faire des requêtes avec des réglages très poussés (basic auth, modification des headers, etc).
Si vous ne la connaissez pas je suis sûr qu'elle vous manque !

Ruby : attention à la base 8 (octal)

Hier un collège me dit, je comprends pas j'ai une erreur quand j'itère sur mon array.

Exemple simplifié du code : 

arr = [03,09,42,57]

Voici l'erreur :

Invalid octal digit

En fait en ruby vous pouvez déclarer un entier en hexa, décimal, binaire.

hexa : 0x81 => 129

binaire : 0b11 => 3

décimal : 42 => 42

octal : 010 => 8.

Le fait de mettre un zero devant permet de dire à ruby que l'on travaille avec des nombres en octal et en octal les digits 8, 9 n'existe pas, donc si vous faites 08 vous allez avoir une erreur (de la même manière que 0b2 va provoquer une erreur...).

En fait l'erreur vient du développeur qui met des 0 non significatif devant ses entiers...

vendredi 15 juillet 2016

Lancer une requête sql contenu dans un fichier avec psql (postgresql)

Pour lancer une requête contenue dans un fichier avec psql, il suffit de faire : 

\i lefichier.sql

Pratique pour éditer la requête avec son éditeur préféré et l'importer sans copier/coller.

vendredi 8 juillet 2016

Sprockets::FileNotFound in Beautiful#dashboard : couldn't find file 'jquery.ui.all'

Pour corriger l'erreur Sprockets::FileNotFound in Beautiful#dashboard : couldn't find file 'jquery.ui.all' dans une application qui utilise beautiful_scaffold il faut remplacer : 

 *= require jquery.ui.all 

Par  

*= require jquery-ui

- page 1 de 48