3 акселерометра mma7660 на i2c

nikitka
Offline
Зарегистрирован: 14.10.2014

Добрый день! Пишу работу по теме "трение при ударе", для этого решил собрать 3 акселерометра на одной i2c, поставить их в разные места (на то чем буду ударять, и куда буду ударять), затем смотреть скачки на графиках в момент удара и делать выводы. Установка с маятниками и всем прочим имеется. Вопросы по шине и акселерометрам mma7660 (http://www.seeedstudio.com/depot/Grove-3Axis-Digital-Accelerometer15g-p-...):
Можно ли с ними снять единомоментные показания?
Я пытался и читал, но не смог осилить подключение. Узнал что для слейвов в даташите указаны адреса с 8 по 19, но далее не смог продвинуться, как заставить их работать? Ранее только в ознакомить лётных целях работал с Ардуино.

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

одновременно не получится точно

но возможно это будет очень быстрое поочередное опрашивание. но хз какая скорость опроса акселерометра

nikitka
Offline
Зарегистрирован: 14.10.2014

Может быть тогда проще на каждую Ардуино по одному акселерометру? И потом просто графики наложить?

faraddin
Offline
Зарегистрирован: 11.08.2013

Я конечно с акселерометрами не сталкивался лично, но наверное должны быть те, которые без I2C работают. Которые работают напряму вполне можно подключить параллельно, лишь бы выводов хватило

 

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

самые точные с сожалению получатся только с 3 ардуинами. причем 2 из них будут синхронизироваться по первой. чтобы были одни временные точки

nikitka
Offline
Зарегистрирован: 14.10.2014

У меня есть три ардуино Уно и акселерометры, с удовольствием откажусь от одной шины, но тогда вопоос : как их вместе заставить работать? Я попробовал запустить уно-акс и уно-акс, постукать, покидать, из значений график построить, но без синхронизации это просто туфта (

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

сделай просто. объедени земли ардуин. выбери любой пин с которого будешь  подавать сигнал остальным

подключать к остальным на пин 2 или 3. использовать прерывание короче

главная отправляет сигнал и начинает измерять. остальные по этому сигналу тоже начинают измерять. получится одновременно

на главной можно еще часы повесить. она будет хранить временные метки. наверно это нужно

далее просто собрать данные и все. черти графики и т.д.

nikitka
Offline
Зарегистрирован: 14.10.2014

а можно, пожалуйста, несколько подробнее? есть стандартынй скетч вывода показаний акселерометра, есть 3 ардуино, на каждую подключен акселерометр и вставлен кусок кода, отвечающий за их работу. на этом работа с самими акселерометрами закончена и теперь задача только объеденить ардуино все вместе, так? Земли объеденил.  

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

давай код

nikitka
Offline
Зарегистрирован: 14.10.2014
вот стандартная для вывода показания с акселерометра:

#include <Wire.h>
#include "MMA7660.h"
MMA7660 accelemeter;
void setup()
{
	accelemeter.init();  
	Serial.begin(9600);
}
void loop()
{
	int8_t x;
	int8_t y;
	int8_t z;
	float ax,ay,az;
	accelemeter.getXYZ(&x,&y,&z);
	
	Serial.print("x = ");
    Serial.println(x); 
    Serial.print("y = ");
    Serial.println(y);   
    Serial.print("z = ");
    Serial.println(z);
	
	accelemeter.getAcceleration(&ax,&ay,&az);
    Serial.println("accleration of X/Y/Z: ");
	Serial.print(ax);
	Serial.println(" g");
	Serial.print(ay);
	Serial.println(" g");
	Serial.print(az);
	Serial.println(" g");
	Serial.println("*************");
	delay(500);
}

еще есть сами библиотеки для mma7660: 

/*****************************************************************************/
//	Function:    Header file for class MMC7660 
//  Hardware:    Grove - 3-Axis Digital Accelerometer(В±1.5g)
//	Arduino IDE: Arduino-1.0
//	Author:	 Frankie.Chu		
//	Date: 	 Jan 10,2013
//	Version: v0.9b
//	by www.seeedstudio.com
//
//
//  This library is free software; you can redistribute it and/or
//  modify it under the terms of the GNU Lesser General Public
//  License as published by the Free Software Foundation; either
//  version 2.1 of the License, or (at your option) any later version.
//
//  This library is distributed in the hope that it will be useful,
//  but WITHOUT ANY WARRANTY; without even the implied warranty of
//  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
//  Lesser General Public License for more details.
//
//  You should have received a copy of the GNU Lesser General Public
//  License along with this library; if not, write to the Free Software
//  Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
//
/*******************************************************************************/
#ifndef __MMC7660_H__
#define __MMC7660_H__

#define MMA7660_ADDR  0x4c

#define MMA7660_X     0x00
#define MMA7660_Y     0x01
#define MMA7660_Z     0x02
#define MMA7660_TILT  0x03
#define MMA7660_SRST  0x04
#define MMA7660_SPCNT 0x05
#define MMA7660_INTSU 0x06
#define MMA7660_MODE  0x07
	#define MMA7660_STAND_BY 0x00
	#define MMA7660_ACTIVE	 0x01	
#define MMA7660_SR    0x08		//sample rate register
	#define AUTO_SLEEP_120	0X00//120 sample per second
	#define AUTO_SLEEP_64	0X01
	#define AUTO_SLEEP_32	0X02
	#define AUTO_SLEEP_16	0X03
	#define AUTO_SLEEP_8	0X04
	#define AUTO_SLEEP_4	0X05
	#define AUTO_SLEEP_2	0X06
	#define AUTO_SLEEP_1	0X07
#define MMA7660_PDET  0x09
#define MMA7660_PD    0x0A
class MMA7660
{
private:
	void write(uint8_t _register, uint8_t _data);
	uint8_t read(uint8_t _register);
public:
	void init();
	void setMode(uint8_t mode);
	void setSampleRate(uint8_t rate);
	unsigned char getXYZ(int8_t *x,int8_t *y,int8_t *z);
	unsigned char getAcceleration(float *ax,float *ay,float *az);
};

#endif

и еще один код для mma7660

/*****************************************************************************/
//    Function:     Cpp file for class MMC7660
//  Hardware:    Grove - 3-Axis Digital Accelerometer(В±1.5g)
//    Arduino IDE: Arduino-1.0
//    Author:     Frankie.Chu
//    Date:      Jan 10,2013
//    Version: v0.9b
//    by www.seeedstudio.com
//
//  modify by loovee
//  2013-9-25
//  add time out funtion in getXYZ
//  This library is free software; you can redistribute it and/or
//  modify it under the terms of the GNU Lesser General Public
//  License as published by the Free Software Foundation; either
//  version 2.1 of the License, or (at your option) any later version.
//
//  This library is distributed in the hope that it will be useful,
//  but WITHOUT ANY WARRANTY; without even the implied warranty of
//  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
//  Lesser General Public License for more details.
//
//  You should have received a copy of the GNU Lesser General Public
//  License along with this library; if not, write to the Free Software
//  Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
//
/*******************************************************************************/
#include <Wire.h>
#include <Arduino.h>
#include "MMA7660.h"
/*Function: Write a byte to the register of the MMA7660*/
void MMA7660::write(uint8_t _register, uint8_t _data)
{
    Wire.begin();
    Wire.beginTransmission(MMA7660_ADDR);
    Wire.write(_register);
    Wire.write(_data);
    Wire.endTransmission();
}
/*Function: Read a byte from the regitster of the MMA7660*/
uint8_t MMA7660::read(uint8_t _register)
{
    uint8_t data_read;
    Wire.begin();
    Wire.beginTransmission(MMA7660_ADDR);
    Wire.write(_register);
    Wire.endTransmission();
    Wire.beginTransmission(MMA7660_ADDR);
    Wire.requestFrom(MMA7660_ADDR,1);
    while(Wire.available())
    {
        data_read = Wire.read();
    }
    Wire.endTransmission();
    return data_read;
}

void MMA7660::init()
{
    setMode(MMA7660_STAND_BY);
    setSampleRate(AUTO_SLEEP_120);
    setMode(MMA7660_ACTIVE);
}

void MMA7660::setMode(uint8_t mode)
{
    write(MMA7660_MODE,mode);
}
void MMA7660::setSampleRate(uint8_t rate)
{
    write(MMA7660_SR,rate);
}
/*Function: Get the contents of the registers in the MMA7660*/
/*          so as to calculate the acceleration.            */
unsigned char MMA7660::getXYZ(int8_t *x,int8_t *y,int8_t *z)
{

    unsigned char val[3];
    int count = 0;
    val[0] = val[1] = val[2] = 64;
    
    long timer1 = millis();
    long timer2 = 0;
    
    while(Wire.available() > 0)
    {
        timer2 = millis();
        if((timer2-timer1)>500)
        {
            return 0;
        }
    }

    Wire.read();
    Wire.requestFrom(MMA7660_ADDR,3);

    timer1 = millis();
    while(Wire.available())
    {
    
        if(count < 3)
        {

            timer1 = millis();
            while ( val[count] > 63 )  // reload the damn thing it is bad
            {
                val[count] = Wire.read();

                timer2 = millis();
                if((timer2-timer1)>50)
                {
                    return 0;
                }

            }
        }

        count++;
        
        timer2 = millis();
        
        if((timer2-timer1)>500)
        {
            return 0;
        }

    }
    
    *x = ((char)(val[0]<<2))/4;
    *y = ((char)(val[1]<<2))/4;
    *z = ((char)(val[2]<<2))/4;
    
    return 1;
}

unsigned char MMA7660::getAcceleration(float *ax,float *ay,float *az)
{
    int8_t x,y,z;
    
    if(!getXYZ(&x, &y, &z))return 0;
    *ax = x/21.00;
    *ay = y/21.00;
    *az = z/21.00;
    
    return 1;
    
}

есть еще, когда по i2c и второй акселерометр слейв: (но он уже видимо не нужен)

#include <Wire.h>

#define I2C_ADDRESS 0x4C
#define I2C_ADDRESS_W 0x99 //MMA7660 Address + 1 bit (Write) pag. 21
#define I2C_ADDRESS_R 0x98 //MMA7660 Address + 0 bit (Read) pag 21
#define TILT_STATUS 0x03
#define SRST 0x04
#define SPCNT 0x05
#define INTSU 0x06
#define MODE 0x07
#define SR 0x08
#define PDET 0x09
#define PD 0x0A

#define POWER_UP_DELAY 10

#define X_OUT 0x00
#define Y_OUT 0x01
#define Z_OUT 0x02

void setup()
{
Serial.begin(38400); // start serial for output
Serial.println("Setting up I2C protocol...");
Wire.begin();
SLAVE_I2C_INIT();
pinMode(13, OUTPUT);
}

void loop()
{
char x = SLAVE_I2C_READ(X_OUT);
char y = SLAVE_I2C_READ(Y_OUT);
char z = SLAVE_I2C_READ(Z_OUT);
char mode = SLAVE_I2C_READ(0x07);
// char tilt = SLAVE_I2C_READ(0x03);
char sample = SLAVE_I2C_READ(0x04);
// char fac = SLAVE_I2C_READ(0x0B);

Serial.print("X=");
Serial.print(x, DEC);
Serial.print(", Y=");
Serial.print(y, DEC);
Serial.print(", Z=");
Serial.print(z, DEC);
Serial.print(", Mode=");
Serial.print(mode,DEC);
//Serial.print(", Tilt=");
// Serial.print(tilt,DEC);
Serial.print(", sample=");
Serial.print(sample,DEC);
//Serial.print(", fac=");
//Serial.print(fac,DEC);
Serial.println(".");
delay(100);

}
void SLAVE_I2C_INIT()
{

Serial.println("Powering up SLAVE interface...");
delay(POWER_UP_DELAY);

SLAVE_I2C_SEND(MODE,0x00); // Setting up MODE to Stand by to set SR
delay(100);

SLAVE_I2C_SEND(SR,0x00); // Setting up SR register to 120 samples active and auto sleep mode
delay(100);

SLAVE_I2C_SEND(MODE,0x01); //Setting up MODE Active to START measures
delay(100);


}

void SLAVE_I2C_SEND(unsigned char REG_ADDRESS, unsigned char DATA) //SEND data to MMA7660
{
Wire.beginTransmission(I2C_ADDRESS);
Wire.write(REG_ADDRESS);
Wire.write(DATA);
Wire.endTransmission();
}

unsigned char SLAVE_I2C_READ(unsigned char REG_ADDRESS) //READ MMA7660 data
{
unsigned char R_VALUE;
Wire.beginTransmission(I2C_ADDRESS);
Wire.write(REG_ADDRESS); // register to read
Wire.endTransmission();

Wire.requestFrom(I2C_ADDRESS, 1); // read a byte
while(!Wire.available())
{
digitalWrite(13, HIGH);
delay(100);
digitalWrite(13, LOW);
delay(100);
}

R_VALUE = Wire.read();
return R_VALUE;
}

 

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

во первых когда вставляешь код больше 10 строк ставь галочку сворачивать код по умолчанию

насколько быстро работает этот код? только убери все про отправку в сериал в лупе. с помощью millis() измерь время опроса датчика, чтобы понять на что рассчитывать и если ли смысл продолжать

вот стандартная для вывода показания с акселерометра:

#include <Wire.h>
#include "MMA7660.h"
MMA7660 accelemeter;
void setup()
{
	accelemeter.init();  
	Serial.begin(9600);
}
void loop()
{
	int8_t x;
	int8_t y;
	int8_t z;
	float ax,ay,az;
	accelemeter.getXYZ(&x,&y,&z);
	
	Serial.print("x = ");
    Serial.println(x); 
    Serial.print("y = ");
    Serial.println(y);   
    Serial.print("z = ");
    Serial.println(z);
	
	accelemeter.getAcceleration(&ax,&ay,&az);
    Serial.println("accleration of X/Y/Z: ");
	Serial.print(ax);
	Serial.println(" g");
	Serial.print(ay);
	Serial.println(" g");
	Serial.print(az);
	Serial.println(" g");
	Serial.println("*************");
	delay(500);
}

 

nikitka
Offline
Зарегистрирован: 14.10.2014

на это код 



#include <Wire.h>
#include "MMA7660.h"
MMA7660 accelemeter;
unsigned long time;

void setup()
{
	accelemeter.init();  
	Serial.begin(9600);
}
void loop()
{
  Serial.print("Time: ");
  time = millis();
  Serial.println(time);
   
	
  int8_t x;
	int8_t y;
	int8_t z;
	float ax,ay,az;
	accelemeter.getXYZ(&x,&y,&z);
	
//	Serial.print("x = ");
//    Serial.println(x); 
//    Serial.print("y = ");
//    Serial.println(y);   
//    Serial.print("z = ");
//    Serial.println(z);
	
	accelemeter.getAcceleration(&ax,&ay,&az);
//    Serial.println("accleration of X/Y/Z: ");
//	Serial.print(ax);
//	Serial.println(" g");
//	Serial.print(ay);
//	Serial.println(" g");
//	Serial.print(az);
//	Serial.println(" g");
//	Serial.println("*************");
	delay(500);
}

показал значения: 

Time: 1
Time: 501
Time: 1003
Time: 1504
Time: 2006
Time: 2507
Time: 3008
Time: 3510
Time: 4012
Time: 4512
Time: 5014
Time: 5516
Time: 6017
Time: 6518
Time: 7020
Time: 7521
Time: 8023
Time: 8524
Time: 9025
 
jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

а delay то зачем оставил?

и используй micros()

nikitka
Offline
Зарегистрирован: 14.10.2014

поставив микрос и закомментировав delay(500) 

1 сек = 1\4 000 000 от полученного значения? 

т.е. в моем случае время прохода один раз составляет 0.000304 секунды?

получил: 

 Time: 1216

Time: 2528
Time: 3844
Time: 5160
Time: 6476
Time: 7792
Time: 14700
Time: 28220
Time: 41740
Time: 55260
Time: 68780
Time: 82300
Time: 95820
Time: 109340
Time: 123900
Time: 138464
Time: 153020
Time: 167584
Time: 182140
Time: 196700
jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

проверь так. сразу разница будет. и переменные каждый раз объявлять глупо

#include <Wire.h>
#include "MMA7660.h"
MMA7660 accelemeter;
unsigned long time;
int8_t x;
int8_t y;
int8_t z;
float ax,ay,az;

void setup()
{
  accelemeter.init();  
  Serial.begin(9600);
}
void loop(){
  time = micros();
  accelemeter.getXYZ(&x,&y,&z);
  accelemeter.getAcceleration(&ax,&ay,&az);
  Serial.println(micros()-time);
}

 

nikitka
Offline
Зарегистрирован: 14.10.2014

вот так вот получилось(значение в 50 тыс. через каждые 90 строк повторяется): 

1008
1012
1012
1008
1012
1004
1012
1004
1008
1084
1096
1084
1096
1084
1092
52132
1088
1084
1096
1088
1096
1084
1088
1096
1084
1092
1088
1088
1092
1096
1088
1096
1088
1092
1096
1096
1088
 
jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

ну такие значения приемлимы. можно и поизмерять

nikitka
Offline
Зарегистрирован: 14.10.2014

Отлично! каждый по отдельности у меня измеряет, а вместе как? я просто очень поверхностно знаком с тем как это работает! 

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

почитай про прерывания. не буду за тебя все делать. а принцип уже описал

nikitka
Offline
Зарегистрирован: 14.10.2014

понял! к концу недели постараюсь разобраться! 

nikitka
Offline
Зарегистрирован: 14.10.2014

я пока таким образом научился принимать сигнал со второй на первую ардуино: 

передает:

int led = 13;
int arcon = 1;
int val = 0;   
void setup() 
{                
  pinMode(led, OUTPUT);    
  pinMode (arcon, INPUT); 
}

void loop() 
{ 
    digitalWrite(led, digitalRead(arcon));
  
}

получает: 


int arcon = 3; 
void setup() 
{                
 pinMode (arcon, OUTPUT); 
}
void loop() 
{    
  digitalWrite(arcon, HIGH);
  delay(1000);
   digitalWrite(arcon, LOW);
  delay(1000);
}

 

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

перепутал местами, но смысл правильный. только теперь на прерываниях

nikitka
Offline
Зарегистрирован: 14.10.2014

если я использую rx tx для считывания значений с одной ардуино на другую, то какими командами к ним обращаться, serial, как я понял, не работает, потому что в это же время используется подключение по юсб! с лампочкой понятно - там либо лоу либо хай, а как записать данные и отправить на ногу я не понял!  

прерывание мне нужно ставить каждый раз, когда посылающая ардуинка отпраила сигнал и что бы принимающая могла его успевать каждый раз записывать? 

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

по прерыванию две остальные измеряют и например хранят данные в оперативной памяти. а  после измерений как хочешь. можешь в eeprom в конце измерения записать  и считать с каждой (для 500 измерений нужно всего 1кбайт оперативки), можешь на sd карту записывать или в uart отправить. короче как хочешь и как сможешь

nikitka
Offline
Зарегистрирован: 14.10.2014

я написал для передачи времени, но почему то значения разнятся с теми, что были раньше 

получает: 

void setup()
{
  Serial.begin(9600);
}
void loop()
{
  if(Serial.available())
  {

     delay(10);
     unsigned long x = Serial.read();
      Serial.println(x);
    
  }
}

передает: 

#include <Wire.h>
#include "MMA7660.h"
MMA7660 accelemeter;
int8_t x;
int8_t y;
int8_t z;
float ax,ay,az;
unsigned long time;
  void setup()
  {
    Serial.begin(9600);
    accelemeter.init();
  }
  void loop()
  {
      time = micros();
  accelemeter.getXYZ(&x,&y,&z);
  accelemeter.getAcceleration(&ax,&ay,&az);
  time = (micros()-time);
    Serial.write(time);
  }

выдает около 

68
32
68
32
68
68
68
60
68
60
68
64
68
60
68
28
68
56
68
36
68
28
68
32
 
 
nikitka
Offline
Зарегистрирован: 14.10.2014

я правильно понимаю, что по поводу прерываний надо использовать http://arduino.ru/Reference/AttachInterrupt в отправляющем контроллере в void setup() поставть? или нет? Подскажи пожалуйста!

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

нет. должно быть в приемных. приемные должны по прерыванию начать измерять. а передающей не надо. она сама говорит когда начинать

nikitka
Offline
Зарегистрирован: 14.10.2014

 сделал для принимающей вот так вот: но все равно не работает. 

unsigned long x;
void setup()
{
  Serial.begin(9600);
attachInterrupt(0, priem, CHANGE);
}
void loop()
{
  void priem()
  {
  if(Serial.available() == 0)
  {
    x = Serial.read();
     Serial.println(x);
  }}
}

 

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

http://arduino.ru/Reference/AttachInterrupt

посмотри пример как нужно правильно оформлять

nikitka
Offline
Зарегистрирован: 14.10.2014

подумал и решил сделать таким вот образом: подключить на каждый ком порт по ардуино и через процессинг записывать показания в один файл, что думаешь? с одной пока что все работает! 

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

а как синхронизировать будешь?

то что процессинг будет собирать и строить графики хорошо, но тебе же нужна привязка ко времени процессов или неважно если показания одного из датчиков будут отставать?

nikitka
Offline
Зарегистрирован: 14.10.2014

вот так вот выглядит код для процессинга: 

 

// Example by Tom Igoe

import processing.serial.*;

Serial myPort;
Serial myPort1;
PrintWriter output;
// The serial port

void setup() {
  // List all the available serial ports:
  println(Serial.list());
  // Open the port you are using at the rate you want:
  myPort = new Serial(this, Serial.list()[1], 9600);
  myPort1 = new Serial(this, Serial.list()[2], 9600);
  output = createWriter("positions.txt"); 
}

void draw() {
  while (myPort.available() > 0 && myPort1.available() > 0)  {
    String inBuffer = myPort.readString();
    String inBuffer1 = myPort1.readString();
    if (inBuffer != null && inBuffer1 != null) {
      println(inBuffer);
      output.println(inBuffer); 
      println(inBuffer1);
      output.println(inBuffer1);
     
    }
  }
}

void keyPressed() {
  
  output.flush(); // Writes the remaining data to the file
  output.close(); // Finishes the file
  exit(); // Stops the program
}

а вот так вот выглядят выводы: 

xD = 0
yD = 0
zD = 0
accleration of X/Y/Z FOR DUE: 
0.00 gD
0.00 gD
0.00 gD
due*************

x = 0
y = 0
z = 0

xD = 0


accleration of X/Y/Z FOR UNO: 
0.00 g
0.00 g
0.00 g
*************

yD = -17
zD = 14
accleration of X/Y/Z FOR DUE: 
0.00 gD
-0.81 gD
0.67 gD
due*************

x = 1
y =
xD = 0
y
 2
z = 20
accleration of X/Y/Z FOR UNO: 
0.00 g
0.00 g
0.00 g
*************

как видно он не совсем последовательно выводит. кто быстрее того и вывел. тут тоже получается надо синхронизировать, но я не понимаю как( 

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

да писал уже. как по другому сделать сам придумывай

nikitka
Offline
Зарегистрирован: 14.10.2014

через прерывания. но я не разобрался что было не так с тем. http://arduino.ru/forum/apparatnye-voprosy/3-akselerometra-mma7660-na-i2c#comment-85759 тут я включаю прерывание priem, затем это прерывание должно при условии получения чего либо записывать эту информацию в файл. 

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

а в 

http://arduino.ru/forum/apparatnye-voprosy/3-akselerometra-mma7660-na-i2...

я писал что посмотри как правильно оформлять

nikitka
Offline
Зарегистрирован: 14.10.2014

у меня ошибка в том, что я не правильно задаю function? "function: функция, вызваемая прерыванием, функция должна быть без параметров и не возвращать значений

программа для ведущей ардуино с акселерометром должна выглядеть так: ардуино получает значения от акселерометра и записывает их, но, если на цифровом порту есть сигнал, то включается прерывание и он должен записать полученные данные с цифрового порта?  

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013
int8_t x;
int8_t y;
int8_t z;
 
и 
 
float ax,ay,az;
что нужно из этого или оба?
nikitka
Offline
Зарегистрирован: 14.10.2014

пока не поставил на установку думаю что оба(ускорение смотрю, а перемещение может быть пригодится), потом будет убрана одна ось и даже может быть и вторая. 

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

проверь. скорость 115200. мне нужно последнее число

unsigned long time;
float ax = 25.365;

void setup(){
  Serial.begin(115200);
}
void loop(){
  time = micros();
  for(int i=0;i<1000;i++){
    Serial.println(ax);
  }
  Serial.println((micros()-time)/1000);
  while(1){
  }
}

 

nikitka
Offline
Зарегистрирован: 14.10.2014

589 выдал, а что он считает?

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

это сколько занимает передача числа с плавающей запятой в uart на скорости 115200

0,59 мс неплохо. как часто нужно измерять?

50-100-200 милиссекунд

 

nikitka
Offline
Зарегистрирован: 14.10.2014

чем чаще - тем лучше, там маятник бьет по вагонетке, которая на пружинах калеблется туда-сюда.  

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

попробуй так. на 2 пин подавай сигнал от второй ардуины. при сигнале первая должна провести измерения и отправить в uart

#include <Wire.h>
#include "MMA7660.h"
MMA7660 accelemeter;

float ax,ay,az;

void setup()  {
  Serial.begin(115200);
  accelemeter.init();
  attachInterrupt(0, blink, RISING);
}
void loop(){

}

void accel(){
  accelemeter.getAcceleration(&ax,&ay,&az);
  Serial.print(ax);
  Serial.print("\t");Serial.print("\t");
  Serial.print(ay);
  Serial.print("\t");Serial.print("\t");
  Serial.println(az);
}

минимум около 10 мс чтобы точно установилось. а это 100 раз в секунду

nikitka
Offline
Зарегистрирован: 14.10.2014

я попробовал подававать 1 на второй вход через равные промежутки времени - ничего не произошло! 

так же попробовал залить код который был у нас ранее для передачи значений - тоже ничего не вышло! 

 

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

а ты как смотришь? в терминале ардуины или сразу в процессинг шлешь?

nikitka
Offline
Зарегистрирован: 14.10.2014

в терминале ардуины! надо просто любое чредование 0 и 1 подавать, верно? 

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

ну да. попробуй с частотой 1гц для начала

nikitka
Offline
Зарегистрирован: 14.10.2014

я взял стандартное мигание светодиодом на 13 порту - там как раз 1 Гц, соеденил 13 порт со 2-ым на главной и ничего не происходит. 

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013
#include <Wire.h>
#include "MMA7660.h"
MMA7660 accelemeter;

float ax,ay,az;

void setup()  {
  Serial.begin(115200);
  accelemeter.init();
  attachInterrupt(0, accel, RISING);
}
void loop(){

}

void accel(){
  accelemeter.getAcceleration(&ax,&ay,&az);
  Serial.print(ax);
  Serial.print("\t");Serial.print("\t");
  Serial.print(ay);
  Serial.print("\t");Serial.print("\t");
  Serial.println(az);
}

попробуй еще раз

nikitka
Offline
Зарегистрирован: 14.10.2014

ничего не происходит! 

 

nikitka
Offline
Зарегистрирован: 14.10.2014

ничего не происходит!