A l'occasion des Journées Européennes du Patrimoine 2018 placées sous le thème de "L'art en partage", Smag0 et l'association "Les Bricodeurs" vous propose d'utiliser dans plusieurs espaces culturels le dispositif "YunDessinCollaboratif"
Gallerie que Twitter (@DCollaboratif) : https://twitter.com/DCollaboratif
Qu'est ce que YunDessinCollaboratif (YDC) ?
YDC est un dispositif permettant à des dizaines d'utilisateurs de partager la création d'une oeuvre artistique.
Il suffit de se connecter sur le réseau Wifi du boitier, d'ouvrir la page d'accueil, et chacun peut dessiner grâce à son smartphone, sa tablette ou son ordinateur sur une oeuvre collaborative.
Chacun est libre de compléter l'oeuvre en temps réel.
Fonctionnalités complémentaires
YDC permet d'effectuer des captures d'écran afin de sauvegarder à tout moment une oeuvre
-à développer : YDC enregistre automatiquement à chaque minute une capture d'écran afin de recréer un historique de la création collaborative
- à développer : YDC permet la création de "salles" pour élaborer plusieurs oeuvres en même temps
- à développer : diffusion en temps réel des oeuvres sur un site internet
Technique :
YunDessinCollaboratif est une application nodejs basée sur de https://sketchpad.tk/
installée sur une carte Arduino Yùn, cette carte proposant un hotspot Wifi.
YDC est installable en tout lieu à condition de disposer d'une prise electrique, et pour la diffusion un pc avec écran ou videoprojecteur avec écran.
Collectif du numérique citoyen Les Bricodeurs est le collectif des professionnels du numérique engagés pour que l’expertise numérique soit au service de l’utilité sociale. Particulièrement attentifs à l’ouverture et la diversité de genre, culturelle et sociale dans nos actions et nos instances, nous établissons une passerelle entre les expertises techniques, les besoins sociétaux et le grand public."
YDC/sketchpad a été testé à plusieurs reprises mais nécessite encore quelques ajustements. Les Bricodeurs se proposent d'animer des ateliers pendant l'été pour les personnes qui souhaiteraient s'investir dans le projet et apprendre à programmer des applications sur ce type de plateforme.
Potentiel actuel : une dizaine de boitiers YDC
04/05/2019: Visite au festival 'Peinture fraîche' à la halle Debourg/ Gerland où j'ai discuté avec Maxime T du projet https://thelivedrawingproject.com/fr/
Les deux projets sont très proches et utilisent la même stack ( nodejs, socket.io, webapp, mobile utilisateur, vidéoprojecteur) pour une même finalité de dessin collaboratif.
Nouvelle inspiration : le dessin est organisé sous forme de calques / layers que les utilisateurs peuvent gérer sauvegarder, copier, partager...
Son idée étant d'illustrer de manière concrète une des possibilités de lier les données personnelles (issues de la personne, de capteurs physiques --> environnement)
Un capteur de rythme cardiaque qui modifierait une playlist : plus le rythme cardique est lent, plus la musique est lente et inversement.
Premier code côté javascript (node, express, socket.io, librairie lininoio, avant la réception du capteur, avec un potentiomètre branché sur A0 pour simuler les variations
//https://github.com/ideino/ideino-linino-lib
///////////////////////////////////////////////////////////
// GESTION NODE EXPRESS SERVEUR
///////////////////////////////////////////////////////////
var express = require('express');
var app = express();
var server = require('http').createServer(app);
var io = require('socket.io')(server);
var port = process.env.PORT || 3006;
///////////////////////////////////////////////////////////
// GESTION DES COMMANDES LINUX comme reboot
///////////////////////////////////////////////////////////
//var exec = require('child_process').exec;
///////////////////////////////////////////////////////////
// GESTION DE LA CARTE ARDUINO
///////////////////////////////////////////////////////////
var linino = require('ideino-linino-lib'),
board = new linino.Board(),
html = new linino.Htmlboard();
//var servoH = { pin: board.pin.servo.S9, value : 180 };
//var pin13 = board.pin.digital.D13;
var pot = board.pin.analog.A0;
// Routing
app.use(express.static(__dirname + '/public'));
//LANCEMENT SERVEUR
server.listen(port, function () {
console.log('Server listening at port %d', port);
console.log('potentiometre : A0');
});
board.connect(function(){
console.log('CARTE Connected');
io.on('connection', function (socket) {
console.log("CLIENT connected");
board.analogRead(pot, function(value){
console.log('value: ' + value);
// var data = {"AO": value};
socket.emit('update', value);
});
});
});
Qui référence les chansons (sotckées dans le dossier /assets) selon leur BPM .
Comme d'hab : setup met en place l'environnement et définit le listener de la communication bi-directionnelle entre la page web et le serveur grâce au listener 'socket.on("update", function(data){...});
var bpm = 0
var play = false;
// convertisseur mp3 : http://youtubemp3.to/
// bpm search : https://songbpm.com/ https://www.bpmdatabase.com/music/search/?artist=&title=&bpm=70&genre=
// p5js playsound https://p5js.org/examples/sound-load-and-play-sound.html
var song ;
var ROAR_90, GETLUCKY_116, COME_100, WALK_105, CARMEN_150, CRUEL_168;
var slider;
function preload() {
// soundFormats('mp3', 'ogg');
// trover des chansons de 40 BPM à 220
ROAR_90 = loadSound('assets/90BPM - Katy Perry - Roar Official.mp3');
COME_100 = loadSound('assets/100BPM - Jain - Come.mp3');
WALK_105 = loadSound('assets/105BPM - Lou Reed - Walk On The Wild Side.mp3');
GETLUCKY_116 = loadSound('assets/116BPM - Daft Punk - Get Lucky.mp3');
CARMEN_150 = loadSound('assets/150BPM - Stromae - carmen.mp3');
CRUEL_168 = loadSound('assets/168BPM - Elvis Presley - Dont Be Cruel.mp3');
console.log("chansons chargées");
}
function setup() {
canvas = createCanvas(windowWidth, windowHeight);
slider = createSlider(40, 220, 70);
slider.position(10, 10);
slider.style('width', width/2+'px');
song = ROAR_90;
fft = new p5.FFT();
song.amp(0.2);
//GETLUCKY_116.play();
// GETLUCKY_116.pause();
console.log("ready");
console.log(socket);
socket.on('update', function (data) {
//var json = JSON.parse(data);
bpm = Math.round(map(data,0,1023,40,220));
console.log(bpm);
slider.value(bpm);
changeSong(ROAR_90, bpm, 80, 95);
changeSong(COME_100, bpm, 95, 102);
changeSong(WALK_105, bpm, 102, 110);
changeSong(GETLUCKY_116, bpm, 110, 120);
changeSong(CARMEN_150, bpm, 120, 160);
changeSong(CRUEL_168, bpm, 160, 220);
});
}
function draw() {
var color = map(bpm,40,220,0,255);
background(color);
noStroke();
//fill(255-color);
fill(bpm, 255-bpm, 0);
ellipse(width/2,height/2,bpm,bpm);
text(bpm,100,100);
//visu
var spectrum = fft.analyze();
noStroke();
fill(0,255,0); // spectrum is green
for (var i = 0; i< spectrum.length; i++){
var x = map(i, 0, spectrum.length, 0, width);
var h = -height + map(spectrum[i], 0, 255, height, 0);
rect(x, height, width / spectrum.length, h )
}
var waveform = fft.waveform();
noFill();
beginShape();
stroke(255,0,0); // waveform is red
strokeWeight(1);
for (var i = 0; i< waveform.length; i++){
var x = map(i, 0, waveform.length, 0, width);
var y = map( waveform[i], -1, 1, 0, height);
vertex(x,y);
}
endShape();
}
function changeSong(s, bpm, min, max){
if ((bpm > min ) && (bpm <= max) && (song != s )){
//ROAR_90.pause();
song.pause();
song = s;
song.play()
console.log(s);
}
}
function mousePressed() {
play = !play;
console.log(play);
if (play){
console.log("play");
song.play();
}else{
console.log("stop");
song.stop();
}
}
Nous avons vu dans l'article précédent comment modifier la page d'accueil de la carte SmagYùn.
Pour rappel, la carte SmagYùn est une préparation particulière de la carte Arduino Yùn, spécialement adaptée pour le développement d'applications multi-utilisateurs, comme pour un brainstorming, ou pour des jeux multi-utilisateurs, en réseau localisé (hotspot).
Pour commander une carte SmagYun déjà configurée, ou poser des questions : twitter @DFaveris ou scenaristeur@gmail.com ou sms au 0671578914.
Nous allons voir aujourd'hui comment accéder aux fonctionnalités Arduino, afin de développer des applications / jeux qui peuvent agir dans le monde réel. On pourra accéder à la totalité des fonctionnalités Arduino (moteurs, leds, capteurs...) au moyen de la librairie https://github.com/ideino/ideino-linino-lib .
Dans l'article précédent, nous avions utilisé l'interface d'administration officielle "ArduinoOs" pour modifier la page d'accueil, tout en mentionnant qu'il était possible d'utiliser WinSCP et putty, et c'est ce que nous allons faire dans ce tutoriel.
Attention ! ! !
On considère ici que vous êtes connecté sur le Wifi "Arduino-Yun-XXX" et que votre carte SmagYun est accessible à l'adresse IP 192.168.240.1, comme expliqué dans l'article précédent :
Accéder au système de fichiers de la carte SmagYùn via Winscp.
Après avoir installé WinSCP, créez un nouveau site et paramétrez le comme suit :
- Protocole de fichiers : SCP,
- Nom d'hôte : 192.168.240.1
- Numéro de port : 22
- Nom d'utilisateur : root
SmagYun Winscp Connexion parametres
Cliquez ensuite sur "Connexion".
Saisissez le mot de passe d'administration de votre carte SmagYun, et validez par "OK"
SmagYun Winscp Connexion Login
Une fois connecté avec WinSCP, la partie gauche représente le disque de votre ordinateur, la partie droite, le système de fichier de la carte SmagYun. Vous pouvez vous y déplacer et parcourir le système de fichier et notamment retrouver le dossier /www dans lequel vous avez modifié la page d'accueil de la carte dans l'article précédent ;-). A vous de voir la manière la plus pratique pour modifier vos fichiers.
SmagYun WinSCP www
Afin de faciliter l'édition des fichiers à partir de WinSCP, il convient maintenant de modifier ses préférences, et de lui dire quel éditeur de texte utiliser. Nous avons choisi ici Notepad++, qui remplit grandement notre besoin pour cette tâche .
Dans WinSCP, sélectionnez dans le menu : Options / Préférences , cliquez sur "ajouter" et dans la section "Editeur externe" allez chercher votre éditeur favoris.
SmagYun WinSCP Preferences Editeur Notepadpp
Maintenant que nous pouvons accéder aux fichiers de la carte SmagYun, on va entrer dans le vif du sujet.
Tester un premier script Javascript sur la carte SmagYun.
Avec la préparation SmagYun vous trouverez dans le répertoire /root/examples quelques exemples d'utilisation des fonctionnalités Arduino depuis javascript. Ce script sera lancé par nodejs, environnement déjà installé.
Naviguez maintenant jusqu'au répertoire /root/examples/
SmagYun WinSCP root examples
L'exemple qui nous intéresse dans un premier temps, est le fichier blink.js présent dans /root/examples/ .
Pour le lancer, on a encore une fois plusieurs options, on peut :
- comme dans l'article précédent passer par la page d'accueil / Admin / ArduinoOs / icone Arduino en haut à gauche / Utilities... mais cette fois, au lieu d'utiliser File Manager, choisissez "Terminal".
- utiliser putty
Utilisation de putty :
Comme avec WinSCP, on va devoir configurer putty :
- Host Name : 192.168.240.1
- Port : 22
SmagYun Putty Configuration
Si putty vous demande d'ajouter / mettre à jour la clé ssh, validez.
SmagYun Putty SSHKey
Vous pouvez maintenant vous connecter au système Linux de la carte SmagYun, en saisissant le nom d'utilisateur et le mot de passe (rappel : "arduino" par défaut, à changer !!!).
SmagYun putty Connexion
Si tout se passe bien vous devriez maintenant voir l'invite de commande :
SmagYun putty Connecte
On continue, on approche, allons maintenant voir ce qui se trouve dans /root/examples avec les commandes cd et ls :
cd /root/examples et ls
SmagYun putty ls root examples
Cool, on retrouve ici notre fichier "blink.js"... tout va bien...
pour le lancer c'est pas plus compliqué que de lancer la commande node blink.js
SmagYun Putty lancement blink.js
Patientez quelques secondes que le script s'initialise.
Si pas de message d'erreur vous devriez normalement voir la led rouge (branchée en parrallèle de la pin 13) clignoter .
Pour arrêter le script utilisez la combinaison de touches Ctrl+C.
Jetons maintenant un œil au code utilisé pour faire clignoter cette LED :
Pour ce faire, retournez dans WinSCP et double-cliquez sur le fichier "blink.js", si WinSCP est bien configuré (éditeur dans préférences), Notepad++ devrait s'ouvrir avec le code du script blink.js
SmagYun Notepadpp edition Blinkjs
Quelques explications sur ce code javascript s'imposent pour la compréhension de la suite :
---
/***
* file: blink.js
* version: 3.0
* author: https://github.com/quasto
* license: mit
* description: in this example the board led on digital pin 13 will
* blink every 1 second .
***/
var linino = require('ideino-linino-lib'),
board = new linino.Board();
var pin13 = board.pin.digital.D13,
ctrl = true;
board.connect( function(){
board.pinMode(pin13, board.MODES.OUTPUT);
setInterval(function(){
if(ctrl){
board.digitalWrite(pin13, board.HIGH);
ctrl = false;
}
else{
board.digitalWrite(pin13, board.LOW);
ctrl = true;
}
},1000);
});
---
var linino = require('ideino-linino-lib'), : import de la librairie / node_module ideino-linino-lib
board = new linino.Board(); : création d'une nouvelle carte
var pin13 = board.pin.digital.D13, : on déclare une variable pin13 correspondant à la broche digitale D13 de la carte
ctrl = true; : et une variable ctrl pour savoir si la led est allumée ou éteinte
board.connect( function(){ ... }); : javascript étant un langage événementiel, on créé un evenement rattaché à l'objet "board" créé précédemment. Cet événement "connect" lancera la fonction incluse dans "function(){...}" dès que la carte sera connectée et opérationnelle.
board.pinMode(pin13, board.MODES.OUTPUT); : on assigne le mode OUTPUT à pin13 pour dire que les informations sur ce pin seront en sortie (envoyées par la carte) comme pour tous les moteurs où LED, contrairement aux capteurs (luminosité, température...) boutons que l'on configurera en INPUT.
setInterval(function(){... },1000); : ça c'est du javascript, et évalue son contenu toutes les 1000 milliseconds (1 seconde).
if(ctrl){...}else{...} : en fonction de la valeur de "ctrl" on exécute la première ou la seconde partie.
board.digitalWrite(pin13, board.HIGH); : utilise la fonction digitalWrite de la "board" pour écrire "board.HIGH" dans pin13.
board.HIGH a pour valeur 1 et correspond à la LED allumée, alors que board.LOW a pour valeur 0 et correspond à la LED éteinte.
Voilà donc le code pour faire clignoter la LED, "Easy" me direz-vous ...
Comme expliqué juste au dessus, la led rouge sur la carte Arduino est branchée en parallèle avec la pin 13.
N'oubliez pas d'arrêter le script lorsque vous branchez / débranchez des composants sur la carte.
Pour vérifier ces propos, branchez une LED sur la PIN13, avec une résistance de 220 ohms pour protéger la LED :
Relancez le script avec "node blink.js" dans putty, les deux LED devrait maintenant clignoter de concert...
Ctrl+C pour arrêter.
C'est bien beau, tout ça, mais on n'a pas encore touché au code.
Essayons par exemple de brancher une deuxième LED sur la pin12.
Dans WinSCP, cliquez droit sur "blink.js" , puis Dupliquer :
SmagYun WinSCP blink duplique
Nommez-le "blink_double.js" et modifiez le code comme suit (bon on ne vas pas se fouler, on va juste copier les lignes concernant la pin13, et modifier HIGH en LOW, et LOW en HIGH) :
---
/***
* file: blink.js
* version: 3.0
* author: https://github.com/quasto
* license: mit
* description: in this example the board led on digital pin 13 will
* blink every 1 second .
***/
var linino = require('ideino-linino-lib'),
board = new linino.Board();
var pin13 = board.pin.digital.D13,
pin12 = board.pin.digital.D12,
ctrl = true;
board.connect( function(){
board.pinMode(pin13, board.MODES.OUTPUT);
board.pinMode(pin12, board.MODES.OUTPUT);
setInterval(function(){
if(ctrl){
board.digitalWrite(pin13, board.HIGH);
board.digitalWrite(pin12, board.LOW);
ctrl = false;
}
else{
board.digitalWrite(pin13, board.LOW);
board.digitalWrite(pin12, board.HIGH);
ctrl = true;
}
},1000);
});
---
Branchez une deuxième LED, comme la première, sur la pin12, lancez ce nouveau script avec "node blink_double.js"
C'est beau l'alternance !
Prochain tutoriel : utiliser nodejs, express et socket.io pour créer un serveur WEB et utiliser ideino-linino-lib depuis une page web.
Pour commander une carte SmagYun déjà configurée, ou poser des questions : twitter @DFaveris ou scenaristeur@gmail.com ou sms au 0671578914.
Quelque exemples d'applis pour la carte SmagYun
Extrait de la page ideino-linino-lib avec les proprietes et fonctions fournies par cette librairie :
Properties and Functions
The board object has these main properties :
HIGH: is the high signal level for digital pins.
LOW: is the low signal level for digital pins.
MODES: contains the operating mode of a pin
.OUTPUT is the output operating mode of a digital pin.
.INPUT is the input operating mode of a digital pin (analog are in input mode by default).
.PWM is the pwm operating mode of a digital pin.
.SERVO is the servo operating mode of a digital pin.
pin: contains all the available pins of the board, grouped by typology :
.digital
.analog
.pwm
.servo
logger: is the log object used by the library with info, debug and error level, console and file appender (see advanced configuration)
SmagYun est une préparation particulière de la carte Arduino Yun officielle.
SmagYun Démos : node avec socket.io pour le temps réel, threejs, p5js, phazer, babylon,
Pour commander une carte SmagYun déjà configurée, ou poser des questions : twitter @DFaveris ou scenaristeur@gmail.com ou sms au 0671578914.
Vous pouvez vous balader avec et la brancher sur un chargeur de smartphone micro-usb, ou sur une batterie pour l'emmener ou vous voulez : dans le bus, au parc, en soirée...
ArduinoYun photo officielle
SmagYun est "tunnée" pour faciliter le développements en proposant un environnement prêt à l'emploi pour le développement d'applications multi-utilisateurs ou de jeux multi-joueurs en réseau local, fourni par un hotspot localisé. Ainsi vous jouez avec les gens qui sont à côté de vous... Une mini-console multi-joueurs...
Comme une Nintendo Switch? Non, pas vraiment, puisque là, chacun possède déjà la manette dans sa poche (son smartphone), de plus, on peut customiser les applications pour agir dans le monde réel, ce que ne fait pas la Nintendo Switch ( Accès aux fonctionnalités Arduino : moteurs, capteurs...) et pour trois fois moins cher que la Switch).
Ces jeux peuvent en effet utiliser les fonctionnalités de la carte Arduino ainsi que les fonctionnalités des smartphones comme contrôleur : accéléromètre, GPS, appareil photo, micro...
SmagYun facilite également la découverte de la programmation avec des outils simples (P5JS...), et de la robotique, la découverte de l'écosystème Arduino et des objets connectés (iot)...
+ Une communauté d'utilisateurs / développeurs pour partager les jeux et applications.
Sur SmagYun, on peut héberger des projets : Javascript, P5js, Threejs, nodejs, babylonjs, phazer, unity, python... Le php est également possible, mysql...
Pour des informations sur la carte Arduino Yun officielle, reportez-vous aux nombreuses documentations proposées sur l'un des deux sites Arduino officiels ou ailleurs sur le net, ça ne manque pas, ici on va parler de SmagYun...
Pour commander une carte SmagYun déjà configurée, ou poser des questions : twitter @DFaveris ou scenaristeur@gmail.com ou sms au 0671578914.
Par où commencer ?
L'Arduino Yun est un peu particulière de par sa configuration : une puce Arduino et une puce Linux.
ArduinoYun utilisée par SmagYun
La préparation SmagYun vous permet de vous affranchir de la programmation de la partie Arduino et vous donne accès aux fonctionnalités Arduino directement depuis une page Web programmée en JavaScript.
Cette préparation transforme les 8Mb de stockage et les bascule sur la carte sd (8Go par exemple), elle inclue également l'installation des outils nécessaires pour vous faciliter les développements, comme l'installation de Nodejs, ou de lininoio. Vous n'avez qu'à la brancher et vous occuper du développement des applications/jeux comme décrit ci-dessous...
La carte SmagYun (ArduinoYun préparée par Smag0) fournit par défaut un hotspot wifi "Arduino-Yun-XXXXXXXXXX" sur lequel on peut connecter un ordinateur ou un smartphone.
SmagYun HotSpot Wifi Connexion
Une fois connecté à ce wifi, vous pouvez lancer votre navigateur à l'adresse http://192.168.240.1 pour voir la page d'accueil de la carte.
SmagYùn Accueil
1ère étape : Comment modifier la page d'accueil de SmagYun ?
La page d’accueil précitée peut être modifiée, c'est le fichier "index.html" du répertoire /www dans le système Linux de la carte.
SmagYun Modification de la page d'accueil
Pour y accéder plusieurs solutions s'offrent à vous :
- depuis la page d'accueil : - rendez-vous dans la section Admin, et cliquez sur "ArduinoOs", saisissez le mot de passe de la carte (arduino par défaut, PENSEZ A LE CHANGER SI VOUS ETES ADMIN !!!!)
SmagYun Admin section
SmagYun ArduinoOs Login
- une fois entré dans l'interface ArduinoOs, cliquez sur l'icone Arduino en haut à gauche, puis sur Utilities, et file Manager. Vous avez ici accès à l'ensemble des fichiers du système Linux.
SmagYun FileManager
- sélectionnez sur la gauche "Arduino storage", et naviguez jusqu'au dossier /www
- double-cliquez sur index.html, et sélectionnez un éditeur de texte (code mirror ou textpad)
SmagYun Edition page d'accueil, sélection de l'éditeur
- faites les modifications souhaitées, et enregistrez votre fichier.
SmagYun Edition page d'accueil, Code-Mirror
- retournez à l'adresse http://192.168.240.1, vous devriez voir vos modifications apparaître.
Ce n'est pas plus compliqué que cela.
Vous pouvez de cette manière customiser votre page et l'adapter à vos besoins.
Pour modifier les fichiers de la carte SmagYun, vous pouvez également utiliser :
- Winscp et Putty depuis Windows.
- Scp et ssh depuis Linux.
plus d'infos sur l'utilisation de WinSCP et putty avec la carte SmagYun dans l'article suivant.
Configurer Winscp et Putty avec l'adresse 192.168.240.1, et SCP pour Winscp.
le repertoire /www est un serveur web. sa configuration peut s'effectuer dans le fichier /etc/config/uhttpd
La pluplart des fichiers de config se trouve dans /etc ou /etc/config.
La configuration est modifiable via les commandes UCI
L'interface Arduinoos permet la plupart des opérations de gestion de la carte.
L'interface Luci permet également d'effectuer des opérations de la carte (basée sur OpenWrt)
Pour commander une carte SmagYun déjà configurée, ou poser des questions : twitter @DFaveris ou scenaristeur@gmail.com ou sms au 0671578914.
Bien maintenant que l'on sait comment accéder aux fichiers et les modifier, tentons d'utiliser les fonctionnalités Arduino depuis Javascript :