Thanks! I’ve successfully imported the accelerations of x,y,z to Processing. But it seems a bit unstable. It seldom work, the majority times it read:
Error, disabling serialEvent() for /dev/cu.usbmodem142301
null
How might I fix it? (I’m trying to use AP-Sync library but I don’t know how to write my Arduino part to adopt the AP-Sync library
Here is the whole codes:
Processing
import processing.serial.*;
Serial myPort;
String inString ;
float[] data = new float [3];
float xA = data[0];
float yA = data[1];
float zA = data[2];
float xV = xA*0.1;
float yV = yA*0.1;
float zV = zA*0.1;
//float xS = 1/2*xA*0.01+xV*0.1;
//float yS = 1/2*yA*0.01+yV*0.1;
//float zS = 1/2*zA*0.01+zV*0.1;
//float xS =width/2;
//float yS =height/2;
//float zS =333;
float xS;
float yS;
float zS;
Planet sun;
PImage sunTexture;
PImage[] textures = new PImage[10];
float fov = PI/3.0;
float cameraZ = (height/2.0) / tan(fov/2.0);
void setup() {
  size(700, 700, P3D);
  xS = width/2;
  yS = height/2;
  zS = 333;
  
  myPort = new Serial(this, Serial.list()[1], 9600);
  //println(Serial.list()[1]);
  myPort.bufferUntil('\n');
  sunTexture = loadImage("sun.jpg");
  textures[0] = loadImage("dirt.jpg");
  textures[1] = loadImage("eris.jpg");
  textures[2] = loadImage("golden.jpg");
  textures[3] = loadImage("green.jpg");
  textures[4] = loadImage("ice.jpg");
  textures[5] = loadImage("lava.jpg");
  textures[6] = loadImage("north.jpg");
  textures[7] = loadImage("ocean.jpg");
  textures[8] = loadImage("pink.jpg");
  textures[9] = loadImage("purple.jpg");
  sun = new Planet(50, 0, 0, sunTexture);
  sun.spawnMoons(10, 1);
}
void draw() {
  background(0);
  camera(xS, yS, zS, (width/2.0), (height/2.0), 0, 0, 1, 0);
  translate(width/2, height/2);
  sun.show();
  sun.orbit();
}
void serialEvent(Serial myPort) {
  
  String inString = myPort.readStringUntil('\n');
  if (inString != null) {
    inString = trim(inString);
    println(inString);
    data = float (split(inString, ','));
    //println(data);
    xA = data[0];
    yA = data[1];
    zA = data[2];
    
    xS += xA*10;
    yS += yA*10;
    zS += zA*10;
    
    
    
    
    //xV = xA*0.1;
    //yV = yA*0.1;
    //zV = zA*0.1;
    //xS = 1/2*xA*0.01+xV*0.1;
    //yS = 1/2*yA*0.01+yV*0.1;
    //zS = 1/2*zA*0.01+zV*0.1;
class Planet {
  float radius;
  float angle;
  float distance;
  Planet[] planets;
  float orbitspeed;
  PVector v;
  
  PShape globe;
  
  Planet(float r, float d, float o, PImage img) {
    v = PVector.random3D();
    radius = r;
    distance = d;
    v.mult(distance);
    angle = random(TWO_PI);
    orbitspeed = o;
    
    noStroke();
    noFill();
    globe = createShape(SPHERE,radius);
    //globe.setTexture(img);
    globe.setTexture(img);
  }
  void orbit() {
    angle = angle + orbitspeed;
    if (planets != null) {
      for (int i=0; i<planets.length; i++) {
        planets[i].orbit();
      }
    }
  }
  void spawnMoons(int total, int level) {
    planets = new Planet[total];
    for (int i=0; i<planets.length; i++) {
      float r = radius/(level*4);
      float d = i*6 + random((radius + r), (radius+r)*6);
    
      float o = random(-0.005, 0.005);
      
      planets[i] = new Planet(r, d, o, textures[i]);
      if (level < 2) {
        int num = int(random(0,2));
        planets[i].spawnMoons(num, level+1);
      }
    }
  }
  void show() {
    pushMatrix();
    noStroke();
    fill(255);
    //rotate(angle);
    PVector v2 = new PVector(1,0,1);
    PVector p = v.cross(v2);
    rotate(angle,p.x,p.y,p.z);
    //stroke(255);
    //line(0,0,0,v.x,v.y,v.z);
    //line(0,0,0,p.x,p.y,p.z);
    
    translate(v.x,v.y,v.z);
    
    
    shape(globe);
    if(distance ==0){
      pointLight(255,255,255,300,187,0);
    }
    
    //sphere(radius);
    //ellipse(0, 0, radius*2, radius*2);
    if (planets != null) {
      //println(planets.length);
      for (int i=0; i<planets.length; i++) {
        planets[i].show();
      }
    }
    popMatrix();
  }
}
  }
}
Arduino
#include <AP_Sync.h>
/**!
 * @file getAcceleration.ino
 * @brief Get the acceleration in the three directions of xyz, the range can be ±6g, ±12g or ±24g
 * @n When using SPI, chip select pin can be modified by changing the value of LIS331HH_CS
 * @copyright  Copyright (c) 2010 DFRobot Co.Ltd (http://www.dfrobot.com)
 * @license     The MIT License (MIT)
 * @author [fengli](li.feng@dfrobot.com)
 * @version  V1.0
 * @date  2021-01-16
 * @url https://github.com/DFRobot/DFRobot_LIS
 */
#include <DFRobot_LIS.h>
//When using I2C communication, use the following program to construct an object by DFRobot_LIS331HH_I2C
/*!
 * @brief Constructor 
 * @param pWire I2c controller
 * @param addr  I2C address(0x18/0x19)
 */
//DFRobot_LIS331HH_I2C acce(&Wire,0x18);
DFRobot_LIS331HH_I2C acce;
//When using SPI communication, use the following program to construct an object by DFRobot_LIS331HH_SPI
#if defined(ESP32) || defined(ESP8266)
#define LIS331HH_CS  D3
#elif defined(__AVR__) || defined(ARDUINO_SAM_ZERO)
#define LIS331HH_CS 3
#elif (defined NRF5)
#define LIS331HH_CS 2  //The pin on the development board with the corresponding silkscreen printed as P2
#endif
/*!
 * @brief Constructor 
 * @param cs : Chip selection pinChip selection pin
 * @param spi :SPI controller
 */
//DFRobot_LIS331HH_SPI acce(/*cs = */LIS331HH_CS,&SPI);
//DFRobot_LIS331HH_SPI acce(/*cs = */LIS331HH_CS);
AP_Sync myPort(Serial);
void setup(void){
  Serial.begin(9600);
  //Chip initialization
  while(!acce.begin()){
     delay(1000);
     Serial.println("Initialization failed, please check the connection and I2C address setting");
  }
  //Get chip id
  //Serial.print("chip id : ");
  //Serial.println(acce.getID(),HEX);
  
  /**
    set range:Range(g)
              eLis331hh_6g = 6,/<±6g>/
              eLis331hh_12g = 12,/<±12g>/
              eLis331hh_24g = 24/<±24g>/
  */
  acce.setRange(/*range = */DFRobot_LIS::eLis331hh_6g);
  /**
    Set data measurement rate:
      ePowerDown_0HZ = 0,
      eLowPower_halfHZ,
      eLowPower_1HZ,
      eLowPower_2HZ,
      eLowPower_5HZ,
      eLowPower_10HZ,
      eNormal_50HZ,
      eNormal_100HZ,
      eNormal_400HZ,
      eNormal_1000HZ,
  */
  acce.setAcquireRate(/*rate = */DFRobot_LIS::eNormal_50HZ);
  //Serial.print("Acceleration:\n");
  delay(1000);
}
void loop(void){
    //Get the acceleration in the three directions of xyz
    //The mearsurement range can be ±6g, ±12g or ±24g, set by the setRange() function
    float ax,ay,az;
    
    ax = acce.readAccX();//Get the acceleration in the x direction
    ax = ax/100;
    if(ax>1000){
      ax = 0;
    }
    ay = acce.readAccY();//Get the acceleration in the y direction
    ay = ay/100;
    if(ay>1000){
      ay = 0;
    }
    az = acce.readAccZ();//Get the acceleration in the z direction
    az = az/100;
    if(az>1000){
      az = 0;
    }
    //Serial.print("x: "); //print acceleration
    
    myPort.print(ax);
    myPort.print(",");
    myPort.print(ay);
    myPort.print(",");
    myPort.println(az);
    //Serial.println("\n");
    //Serial.println(" mg");
    delay(100);
}