Affichage des articles dont le libellé est carte. Afficher tous les articles
Affichage des articles dont le libellé est carte. Afficher tous les articles

03/02/2018

Quand l'environnement s'adapte à moi.


Aurélien du FAbLAB... a sollicité lesBricodeurs pour un atelier à la cité du Design.
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.

--> Arduino Yun avec lininoio

LA LIAISON CAPTEUR APPLI-WEB

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);
  });
 });
 
}); 


accompagné d'un fichier /public/index.html qui fait appel aux librairies P5JS, socket.io :
https://github.com/scenaristeur/lininoapps/blob/master/root/cardio/public/index.html


       
<!DOCTYPE html>
<html>
  <head>
    <meta name="viewport" width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=0>
    <style> body {padding: 0; margin: 0;} </style>
    <script src="lib/p5.min.js"></script>
    <script src="lib/addons/p5.dom.min.js"></script>
    <script src="lib/addons/p5.sound.min.js"></script>
    <script src="js/sketch.js"></script>
  </head>
  <body>
  
  <script src="/socket.io/socket.io.js"></script>
  <script>
 var socket = io();
 console.log(socket);
 /*socket.on('update', function (data) {
  console.log(data);
 });*/
  
  </script>
  </body>
</html>


Et un fichier p5js /public/js/sketch.js :
https://github.com/scenaristeur/lininoapps/blob/master/root/cardio/public/js/sketch.js

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();
 }
 }  


TRANSFORMATION DU SIGNAL

Une fois le capteur reçu, la difficulté était de récupéréer le rythme cardiaque . En effet, le code de base http://learn.linksprite.com/arduino/advanced-learning-kit-for-arduino/how-to-use-heatbeat-sensor-module-on-arduino/ permet de mesurer la variation d'oxygène contenue dans le sens. Il a fallu transformer le signal pour calculer une moyenne du nombre de battements par minutes.

Code de base pour Arduino :

       
// Pulse Monitor Test Script
 
int ledPin = 13;
 
int sensorPin = 0;
 
double alpha = 0.75;
 
int period = 20;
 
double change = 0.0;
 
void setup()                   
 
{
 
  pinMode(ledPin, OUTPUT);
 
  Serial.begin(115200);
 
}
 
void loop()                    
 
{
 
    static double oldValue = 0;
 
    static double oldChange = 0;
 
    int rawValue = analogRead(sensorPin);
 
    double value = alpha * oldValue + (1 - alpha) * rawValue;
 
    Serial.print(rawValue);
 
    Serial.print(",");
 
    Serial.println(value);
 
    oldValue = value;
 
    delay(period);
 
}









[ en cours de rédaction ]










04/12/2014

SpheroCarto - Utiliser Sphero pour cartographier un environnement, et le visualiser avec Processing (APDE)

Une fois n'est pas coutume, prenons le temps de faire le point sur une partie essentielle du projet.

Dans le système SMAG comme je le prévoit, les différents modules robotiques doivent être amenés à échanger les informations qu'ils possèdent, et l'une des informations primordiales pour un objet mobile, est d'abord de savoir dans quel environnement il évolue. L'hypothèse de départ étant un "robot qui range ma chambre" on devra avoir un ou plusieurs robot qui permette aux autres de percevoir l'environnement. N'importe quel appareil mobile, connecté, capable de déterminer sa position par rapport à son point de départ pourra faire l'affaire.

J'avais dans l'idée depuis un bout de temps, d'utiliser SPHERO , une balle programmable, pour tenter de créer une "cartographie" de l'environnement maison. J'en ai trouvé une d'occasion (merci au parquet trop glissant de Matthias !).

Pour rappel, dans l'idée, le système SMAG est un système multi-agent composé de multiples agents indépendants, qui remplissent un rôle. Dans ce qui nous intéresse ici, nous pouvons considérer que la cartographie de l'environnement se décompose en trois 3 composants majeurs.

On aura :
- le robot mobile (ici SPHERO)
- une interface pour commander le robot
- une interface pour visualiser les informations

Dans notre exemple, l'interface pour commander le SPHERO et celle pour visualiser les infos seront toutes les deux dans notre téléphone mais indépendantes (pour l'instant).

Pour l'interface de commande, j'ai choisi Eclipse qui a fait ses preuves en développement Android, et pour l'interface de visualisation, il m'est apparu plus easy d'utiliser Processing, qui fait de jolies interfaces très visuelles, réactives, et souples... ou plutôt APDE sa version mobile.
J'ai utilisé les versions suivantes :
- Eclipse Luna avec le plugin ADT pour (Android Developpement Tool)
- APDE (ou Processing)
- le Sphero Android SDK (avec la version actuelle : Notice: The Sphero Android SDK works with Android 2.2+ and Java Compiler Level 6.0(1.6)+ )
- et ne pas oublier, qu'il te faut évidemment un SPHERO... (Y'en a peut-être un pas trop loin de chez toi qui t'attend  sur le bon coin ???)

Hop, une fois que tu as ton SPHERO en main, les choses intéressantes commencent :

MISE EN PLACE DE L'ENVIRONNEMENT

1. Télécharge le Sphero Android SDK et décompresse -le.
2. Lance Eclipse Luna, si tu ne l'a pas encore, télécharge le, et pendant ce temps, installe l'appli APDE depuis GooglePlay.
3. Une fois Eclipse lancé, on va commencer par se la jouer feignasse... on n'est pas là pour se prendre la tête. Le composant essentiel pour établir la cartographie de l'environnement est sans aucun doute la position de notre robot SPHERO. On va donc s'appuyer sur un des exemples du Sphero Android SDK ... le LOCATOR.
Donc la feignasse, elle ouvre son Eclipse Luna, et elle crée un nouveau projet avec New / Project. Ensuite dans l'assistant (wizzard) choir un projet du type Android (si Android n'apparait pas en dessous de Général, c'est certainement que le plugin ADT n'est pas installé (voir dans Help / Eclipse MarketPlace, et prendre ADT by Google Inc))
Sous Android choisir "Android Project from existing Code" , next et là parcourir jusqu'au Sphero Android SDK téléchargé et décompressé précédemment . et allez jusqu'au dossier Locator. moi dans Browse, j'ai : C:\Users\David\Downloads\Sphero-Android-SDK-master\Sphero-Android-SDK-master\samples\Locator

Laissez faire la Magik Mystique, et Hop !
Nous volià avec une première appli Locator que l'on peut lancer avec un coup de Run dans Eclipse... Là , si vous n'avez jamais utilisé le plugin ADT, il faut configurer l'émulateur (on trouve de la doc là dessus assez facilement).

Moi je veux tester en direct sur mon téléphone, alors je lance le Run mais l'émulateur plante alors je l'arrête , mais je m'en f... parce que c'est pas ça qui m'intéresse... ce qui m'interesse, c'est le fichier APK qui a été créé par le lancement de la commande RUN. il se trouve dans le répertoire bin du répertoire Locator de votre workspace Eclipse (celui que l'on vous demande de confirmer à chaque démarrage)

Ce fichier APK, je le copie sur la carte sd de mon téléphone(via le câble USB). Ensuite, avec un explorateur (comme ES Explorer ) je peux parcourir ma carte et installer l'application que je viens de créer.

D'autres exemples nous seront utiles. On va donc refaire la manip avec le chemin qui s'arrête à la liste des exemple (samples) : C:\Users\David\Downloads\Sphero-Android-SDK-master\Sphero-Android-SDK-master\samples

Là on va cocher : Collision + UISample + Streming Example ( + Locator mais il doit déjà être grisé car déjà installé) + cochez l'option "Copy projects into workspace"

En fait je suis plus feignasse que feignasse, on va utiliser UISample qui est un exemple déjà tout prêt d'interface. Tu peux la tester en faisant comme tout à l'heure un RUN (as android Appli. !) En copiant le fichier présent dans <<ton workspace>>/UISample/bin/ c'est le fichier UiSample.apk

Hop, comme ça, on pourra piquer du code dans ces exemples.

Maintenant au boulot !

... non en fait, trop long de recopier tout le code, si tu veux le récupérer, il est là : https://github.com/scenaristeur/sphero-carto . Il n'est pas encore nickel, il faut que je revoie la correction de direction lors des collision, la mise en veille du tél...
A ta dispo pour corriger, ajouter de nouvelles fonctionnalités... Si tu as des idées, on en discute |-)

+ découvert récemment : un mec qui utilise App Inventor pour contrôler son Sphero. J'ai testé, il reste quelques fignolages, encore, je crois. Je vous ferais signe. Abonnez-vous pour être informé des nouveautés .