Yes of course. The code is for an open source instrument, that is built for a thesis. MCU is an Arduino MEGA 2560.
Excuse me for italianism and thank you in advance for your help
Paolo
//
// RemoteXY select connection mode and include library
#define REMOTEXY_MODE__HARDSERIAL
#include <RemoteXY.h>
// RemoteXY connection settings
#define REMOTEXY_SERIAL Serial3
#define REMOTEXY_SERIAL_SPEED 9600
#include <SPI.h>
#include <SD.h>
#include "SparkFun_MMA8452Q.h" // Click here to get the library: http://librarymanager/All#SparkFun_MMA8452Q
#include <Wire.h> // Must include Wire library for I2C
MMA8452Q accel; // create instance of the MMA8452 class
// RemoteXY configurate
#pragma pack(push, 1)
uint8_t RemoteXY_CONF[] =
{ 255,83,0,23,0,30,3,15,0,4,
130,1,2,1,94,49,2,27,130,1,
56,1,41,22,1,29,130,1,1,1,
53,22,1,29,1,1,66,39,20,5,
1,14,24,83,84,65,82,84,0,66,
0,59,28,4,25,1,31,26,66,131,
76,2,15,9,1,1,24,67,4,66,
28,20,6,1,31,26,11,68,33,1,
27,53,22,1,8,36,67,111,117,110,
116,115,0,131,0,25,53,20,6,1,
206,24,83,67,65,78,0,131,1,3,
53,20,6,2,206,24,83,69,84,0,
70,16,38,9,4,4,2,26,134,0,
70,16,38,16,4,4,2,26,134,0,
70,16,38,23,4,4,2,26,37,0,
70,16,38,31,4,4,2,26,37,0,
7,36,2,2,26,3,1,0,26,29,
11,7,36,2,9,12,3,1,0,26,
29,11,7,36,2,16,12,3,1,0,
26,29,11,7,36,16,9,12,3,1,
0,26,29,11,7,36,16,16,12,3,
1,0,26,29,11,129,0,30,3,10,
2,1,24,70,73,76,69,78,65,77,
69,0,129,0,30,10,16,2,1,24,
50,32,84,72,69,84,65,32,82,65,
78,71,69,0,129,0,30,17,23,2,
1,24,83,84,69,80,32,83,73,90,
69,32,38,32,84,73,77,69,32,83,
73,90,69,0,129,0,2,13,13,2,
1,24,50,32,84,104,32,194,176,32,
83,84,65,82,84,0,129,0,16,13,
11,2,1,24,50,32,84,104,32,194,
176,32,83,84,79,80,0,129,0,2,
20,13,2,1,24,83,84,69,80,32,
83,73,90,69,0,129,0,16,20,13,
2,1,24,84,73,77,69,32,83,73,
90,69,0,10,53,58,9,15,6,1,
14,134,24,82,88,32,79,78,0,31,
82,88,32,79,70,70,0,66,131,76,
13,15,9,1,1,24,129,0,92,6,
3,2,1,24,75,86,0,129,0,92,
15,3,2,1,24,109,65,0,129,0,
59,25,4,2,1,24,67,112,115,0,
129,0,68,25,9,2,1,24,50,32,
116,104,101,116,97,32,40,194,176,41,
0,7,36,46,23,14,4,2,0,26,
29,11,7,36,46,31,14,4,2,0,
26,29,11,129,0,61,24,11,2,2,
24,82,88,45,50,84,194,176,32,115,
116,111,112,0,129,0,61,32,11,2,
2,24,68,88,45,50,84,194,176,32,
115,116,111,112,0,1,1,66,48,20,
5,1,14,31,101,109,101,114,103,101,
110,99,121,32,115,116,111,112,0,1,
1,44,2,9,4,1,14,24,83,69,
78,68,0,129,0,31,20,20,2,1,
24,32,120,32,48,46,48,48,52,53,
194,176,32,32,32,32,32,32,32,32,
32,32,105,110,32,109,83,0,3,5,
4,7,8,37,2,178,201,129,0,14,
10,23,2,2,24,90,69,82,79,32,
50,32,116,104,101,116,97,32,45,32,
82,88,32,84,117,98,101,0,129,0,
14,17,23,2,2,24,90,69,82,79,
32,50,32,116,104,101,116,97,32,45,
32,68,101,116,101,99,116,111,114,0,
129,0,14,24,19,2,2,24,82,88,
32,84,117,98,101,32,112,111,115,105,
116,105,111,110,105,110,103,0,129,0,
14,32,20,2,2,24,68,101,116,101,
99,116,111,114,32,112,111,115,105,116,
105,111,110,105,110,103,0,129,0,14,
39,22,2,2,24,83,97,109,112,108,
101,32,109,111,116,111,114,32,79,78,
47,79,70,70,0,70,16,38,38,4,
4,2,26,37,0,10,48,79,22,12,
12,2,132,26,31,65,108,108,111,119,
0,31,79,70,70,0,129,0,59,55,
30,3,0,200,105,45,88,69,83,32,
120,32,114,97,121,32,109,101,97,115,
117,114,101,115,0 };
// this structure defines all the variables and events of your control interface
struct {
// input variables
float edit_1; // angolo posizione rx float
float edit_2; // angolo posizione dx float
char edit_5[12]; // string UTF8 end zero filename char 12 caratteri compresi gli spazi
float edit_6; // 2 th ini float
float edit_7; // 2 th fin float
int edit_8; // step int
int edit_9; // time int
uint8_t pushSwitch_1; // =1 if state is ON, else =0 RX ON OFF
uint8_t pushSwitch_2; // =1 if state is ON, else =0 ALLOW COMMAND
uint8_t button_5; // =1 if button pressed, else =0
uint8_t button_6; // =1 if button pressed, else =0
uint8_t button_7; // =1 if button pressed, else =0
uint8_t select_1; // =0 if select position A, =1 if position B, =2 if position C, ...
// output variables
int8_t level_1; // =0..100 level position KV 0 - 40
int8_t level_2; // =0..100 level position mA 0 - 0.1
int8_t level_3; // =0..100 level position COUNTS
float text_1; // testo dato angolo 2 theta scansione
float onlineGraph_1_var1; // CONTEGGI
uint8_t led_1; // led state 0 .. 1 LED ZERO RX
uint8_t led_2; // led state 0 .. 1 LED ZERO DX
uint8_t led_3; // led state 0 .. 1 LED POS RX
uint8_t led_4; // led state 0 .. 1 LED POS DX
uint8_t led_5; // led state 0 .. 1 LED MOTOR ON OFF
// other variable
uint8_t connect_flag; // =1 if wire connected, else =0
} RemoteXY;
#pragma pack(pop)
/////////////////////////////////////////////
// END RemoteXY include //
/////////////////////////////////////////////
#define PIN_BUTTON_5 7 // - ridefinire il pin 13
// MOTORE SX
#define dirPin 37
#define stepPin 41
#define enaPin 39
// MOTORE DX
#define dir2Pin 25
#define step2Pin 23
#define ena2Pin 27
// RX CONTROL
#define FILRY 29
#define HV 28
#define VENT 11 //modificato a 11
// SD CARD
#define MOSI 51//blu
#define MISO 50//viola
#define SCK 52//grigio
#define CS 53 //verde
// nero + bianco, massa
// Sensore angolare MMA8452Q
#define SCL 21 // viola
#define SDA 20 // grigioù
// MOTORE AUSILIARIO
#define MOTOR 12//modificato a 12
//SWITCH FINE CORSA
#define SW1SX0 33 // FINE CORSA SINISTRA 0 GRADI
#define SW2DX0 35 // FINE CORSA DESTRA 0 GRADI
// ricorda nello slave A8 corrente A10 tensione da HV
// LED GRB CUPOLA
#define LEDR 10 // LED ROSSI PER RX ON sulla cupola
#define LEDG 8 // LED VERDE cupola
#define LEDB 9 // LED BLU cupola//ex48
// SWITCH CUPOLA
#define SW3C 42 // SWITCH CUPOLA OK/OFF
// INDICATORI
#define LED1 13 // LED BLU SX
#define LED2 49 // LED RED RX ON
#define LED3 47 // led ORANGE
#define LED4 45 // led YELLOW
#define LED5 43 // led GREEN
#define LED6 31 // led BLU DX
// dichiarazione file
File myFile;
// Dichiarazione variabili
int i=0;
int idx = 0;
int isx=0;
int icx=0;
int r=0;
int ireal = 0;
int izero=0;
int novstep = 0;
float zeronovanta =0;
float anginizio=0;
int stepinizio =0;
float angfine =0;
int stepfine = 0;
int stini=0;
int stfine=0;
int val=0;
int v0=0;
int count1 = 0;
int count2=0;
int st=0;
int amin=0;
int amax=0;
int ascan = 0;
float angreach=0;
// procedura di smoothing del dato prima che venga plottato
const int numReadings = 3;
int readings[numReadings]; // the readings from the analog input
int readIndex = 0; // the index of the current reading
int total = 0; // the running total
int average = 0; // the average
int count[numReadings];
//
void setup()
{
RemoteXY_Init ();
pinMode (PIN_BUTTON_5, OUTPUT);
// TODO you setup code
Serial.begin(9600);
//Serial2.begin(9600);
Wire.begin();
// initialize all the readings to 0:
for (int thisReading = 0; thisReading < numReadings; thisReading++) {
readings[thisReading] = 0;
}
// inizializza pin digitali
// MOTORE SX
pinMode(stepPin, OUTPUT); // motore 1
pinMode(dirPin, OUTPUT); // motore 1
pinMode(enaPin,OUTPUT); // motore 1
// MOTORE DX
pinMode(step2Pin, OUTPUT);
pinMode(dir2Pin, OUTPUT);
pinMode(ena2Pin, OUTPUT);
// SWITCH FINE CORSA
pinMode(SW1SX0,INPUT); // 0 GRADI SINISTRO
pinMode(SW2DX0, INPUT); // 0 GRADI DESTRO
// pinMode(SW1SX90, INPUT);// 90 gradi sinistro
// pinMode(SW2DX90, INPUT);// 90 gradi destro
// LED CUPOLA
pinMode(LEDR, OUTPUT); // RX ON e accendi di rosso la cupola
pinMode(LEDG, OUTPUT); // LED Green per il bianco cupola
pinMode(LEDB, OUTPUT); //LED Blue per il bianco cupola
// NB per avere il bianco li devi accendere tutti e tre
// SWITCH cupola
pinMode(SW3C, INPUT); // segnala la cupola chiusa
// LED SEGNALAZIONI VARIE
pinMode(LED1, OUTPUT);
pinMode(LED2, OUTPUT);
pinMode(LED3, OUTPUT);
pinMode(LED4, OUTPUT);
pinMode(LED5, OUTPUT);
pinMode(LED6, OUTPUT);
// RAGGI X
pinMode(HV, OUTPUT);// abilitazione HV
pinMode(VENT, OUTPUT);// abilita ventola
pinMode(MOTOR, OUTPUT);// abilita il motore sample attraverso il MOSFET
//pinMode(FILRY, INPUT);// consente di accendere la tensione ma non prima che il filamento sia acceso
float HVV=0;
float ICC=0;
// INITIALIZE
//prova LED
// inizia test led
//digitalWrite(LEDRX, HIGH);
//delay(500);
digitalWrite(LED6, HIGH);
delay(250);
digitalWrite(LED5, HIGH);
delay(250);
digitalWrite(LED4, HIGH);
delay(250);
digitalWrite(LED3, HIGH);
delay(250);
digitalWrite(LED2, HIGH);
delay(250);
digitalWrite(LED1, HIGH);
// FINE TEST LED
//digitalWrite(LEDRX, LOW);
delay(250);
digitalWrite(LED6, LOW);
delay(250);
digitalWrite(LED5, LOW);
delay(250);
digitalWrite(LED4, LOW);
delay(250);
digitalWrite(LED3, LOW);
delay(250);
digitalWrite(LED2, LOW);
delay(250);
digitalWrite(LED1, LOW);
delay(250);
digitalWrite(LED1, HIGH);// spia on accesa
//ACCENDE LE VENTOLE
digitalWrite(VENT, HIGH);
delay(100);
// PROVA LA CUPOLA
digitalWrite(LEDR, HIGH);
digitalWrite(LEDG, HIGH);
digitalWrite(LEDB, HIGH);
delay(550);
digitalWrite(LEDR, LOW);
digitalWrite(LEDG, HIGH);
digitalWrite(LEDB, LOW);
delay(550);
digitalWrite(LEDR, LOW);
digitalWrite(LEDG, LOW);
digitalWrite(LEDB, HIGH);
delay(550);
digitalWrite(LEDR, HIGH);
digitalWrite(LEDG, LOW);
digitalWrite(LEDB, LOW);
delay(550);
digitalWrite(LEDR, HIGH);
digitalWrite(LEDG, HIGH);
digitalWrite(LEDB, HIGH);
}
void loop() {
RemoteXY_Handler ();
digitalWrite(PIN_BUTTON_5, (RemoteXY.button_5==0)?LOW:HIGH);
// QUI POTREMMO METTERE IL CODICE DI AVVIO DEL PROGRAMMA DI GESTIONE
// TODO you loop code
// use the RemoteXY structure for data transfer
// do not call delay()
int sstep=0;
float angmin=0;
float angmax=0;
int times=0;
int numReadings=0;
Menus();
if(RemoteXY.pushSwitch_1!=0){
RXON();
}
if(RemoteXY.pushSwitch_1!=1){
RXOFF();
}
}
// SUBROUTINES VOID
void Menus() {
switch (RemoteXY.select_1){
case 0: zerotuboRX();break;
case 1: zerodetector();break;
case 2: posizionatuboSX(); break;
case 3: posizionadeteDX(); break;
if(RemoteXY.select_1==4){
Motoron();
}else Motoroff();
//default: continue; // includes the case 'no input'
}}
void zerotuboRX(){
if(RemoteXY.pushSwitch_2!=0){
digitalWrite(enaPin,LOW);
digitalWrite(dirPin, LOW);// il motore SX va alla posizione di zero (gira a sinistra)
for(i=0;i< 22000;i++){
digitalWrite(stepPin,LOW);
delayMicroseconds(500);
digitalWrite(stepPin, HIGH);
delayMicroseconds(500);
delay(0.1);
if(digitalRead(SW1SX0)==HIGH){
digitalWrite(LED6, HIGH);
i=22000;
}}}else {
}}
void zerodetector(){
if(RemoteXY.pushSwitch_2!=0){
digitalWrite(ena2Pin,LOW);
digitalWrite(dir2Pin, LOW);// // il motore DX va alla posizione di zero (gira a sinistra)
for(i=0;i< 22000;i++){
digitalWrite(step2Pin,LOW);
delayMicroseconds(500);
digitalWrite(step2Pin, HIGH);
delayMicroseconds(500);
delay(0.1);
//Serial.println(i);
isx=i;
if(digitalRead(SW2DX0)==HIGH){
digitalWrite(LED5, HIGH);
i=22000;
}}}else {
}}
void posizionatuboSX() {
if(RemoteXY.pushSwitch_2!=0){
float angolosx;
zerotuboRX();
digitalWrite(enaPin,LOW);
digitalWrite(dirPin, HIGH);// il motore SX gira a destra
//Serial.println("");
//Serial.println(" Angolo di posizionamento del tubo: ");
// while (!Serial.available()) {;}
// float angolosx = Serial.parseFloat();
// Serial.print(" ---> ");
// Serial.println(angolosx);
int amminsx= abs(angolosx*0.5/(0.0045));
for(int r=0;r< amminsx;r++){
digitalWrite(stepPin,LOW);
delayMicroseconds(500);
digitalWrite(stepPin, HIGH);
delayMicroseconds(500);
delay(0.1);
}
r=0;
}else {
}}
void posizionadeteDX() {
if(RemoteXY.pushSwitch_2!=0){
float angolodx;
zerodetector();
digitalWrite(ena2Pin,LOW);
digitalWrite(dir2Pin, HIGH);// il motore SX gira a destra
// Serial.println(" Angolo di posizionamento del detector: ");
// while (!Serial.available()) {;}
// float angolodx = Serial.parseFloat();
// Serial.print(" ---> ");
// Serial.println(angolodx);
int ammindx=abs(angolodx*0.5/(0.0045));
for (r=0;r<ammindx;r++){
digitalWrite(step2Pin,LOW);
delayMicroseconds(500);
digitalWrite(step2Pin, HIGH);
delayMicroseconds(500);
delay(0.1);
}
r=0;
}}
void SECUR(){
if(digitalRead(SW3C)==HIGH){
digitalWrite(LED5, HIGH);
digitalWrite(LED4, LOW);
}
if(digitalRead(SW3C)==LOW){
digitalWrite(LED5, LOW);
digitalWrite(LED4, HIGH);
}
}
void LEDRON(){
// serve ad accendere di rosso la cupola
digitalWrite(LEDG, LOW);
digitalWrite(LEDB, LOW);
digitalWrite(LEDR, HIGH);
}
void LEDROFF(){
// serve a spegnere il rosso alla cupola
digitalWrite(LEDG, HIGH);
digitalWrite(LEDB, HIGH);
digitalWrite(LEDR, HIGH);
}
void Deleteparam(){
Serial.println(" Cancellazione file dei parametri ..");
SD.remove("PARAM.txt");
if(SD.exists("PARAM.txt")){
Serial.println(" File PARAM.txt esistente");
}else{
Serial.println(" File PARAM.txt non esistente");
}
}
void Motoron(){
if(RemoteXY.pushSwitch_2!=0){
digitalWrite(MOTOR, HIGH);
digitalWrite(LED3,HIGH);
}}
void Motoroff(){
if(RemoteXY.pushSwitch_2!=1){
digitalWrite(MOTOR, LOW);
digitalWrite(LED3,LOW);
}}
void RXON(){
delay(1000);
digitalWrite(HV, HIGH);// da consenso ad HV
digitalWrite(LED2, HIGH);
}
void RXOFF(){
delay(1000);
digitalWrite(HV, LOW);// toglie consenso ad HV
digitalWrite(LED2, LOW);
//LEDROFF();
delay(2500);
}
void SCANDXRX(){
String id;
// inserire dati se non presenti
zerotuboRX(); // richiama routine trova zero sinistro
zerodetector(); // richiama routine trovazero destro
id = (RemoteXY.edit_5);
float angmin=(RemoteXY.edit_6);
float angmax=(RemoteXY.edit_7);
int sstep=(RemoteXY.edit_8);
int period=(RemoteXY.edit_9);
myFile = SD.open(id, FILE_WRITE);
amin=abs((angmin*0.5)/(0.0045*sstep));// nuova configurazione
amax=abs((angmax*0.5)/(0.0045*sstep));// nuova cnfigurazione, con step da 0.0045° (800 step/giro demoltiplicato per 100)
ascan=amax-amin;// step da "sstep" da percorrere
// routine per attendere l'inserimento del portacampione, senza e con switch aperto non si parte
int i=0;
int inputPin = A6;
digitalWrite(LED2, LOW);
digitalWrite(LED3, LOW);
digitalWrite(LED4, LOW);
digitalWrite(LED5, LOW);
digitalWrite(LED6, LOW);
//posiziona tubo angmin
int ammin=abs((angmin*0.5)/0.0045);
digitalWrite(enaPin,LOW);
digitalWrite(dirPin,HIGH);// il motore SX va a destra
for(i=0;i< ammin;i++){
digitalWrite(stepPin,LOW);
delayMicroseconds(500);
digitalWrite(stepPin, HIGH);
delayMicroseconds(500);
delay(0.1);
}
digitalWrite(LED6, HIGH);
delay(150);
// raggiunta la posizione di tubo theta 1
//posiziona detector angmin
digitalWrite(ena2Pin,LOW);
digitalWrite(dir2Pin,HIGH);// il motore DX va a destra
for(i=0;i< ammin;i++){
digitalWrite(step2Pin,LOW);
delayMicroseconds(500);
digitalWrite(step2Pin, HIGH);
delayMicroseconds(500);
delay(0.1);
}
digitalWrite(LED5, HIGH);
delay(150);
// raggiunta la posizione di detector theta 1
RXON();// accendi i raggi
digitalWrite(LED2, HIGH);
LEDRON();
// INIZIA SCANSIONE
int countka=0;
int countkb=0;
int counttot=0;
for(st=0;st<ascan;st++){
digitalWrite(LED4, HIGH);
digitalWrite(LED3, LOW);
digitalWrite(LED5, HIGH);
for(i=0;i<sstep;i++){
digitalWrite(stepPin,HIGH);
delayMicroseconds(500);
digitalWrite(stepPin, LOW);
delayMicroseconds(500);
delay(0.1);
}
for(i=0;i<sstep;i++){
digitalWrite(step2Pin,HIGH);
delayMicroseconds(500);
digitalWrite(step2Pin, LOW);
delayMicroseconds(500);
delay(0.1);
}
// routine lettura contatore
for (i=0;i<period;i++){
int V=analogRead(A6);
int tensione=map(V,0,1023,0,5000);// qui si impostano le finestre di lettura delle ampiezze degli impulsi
if (tensione>100&&tensione<1100){
countka=countka+1;// m ka
}
if (tensione>1100&&tensione<1300){
countkb=countkb+1;// n kb
}
counttot=countka-countkb;
// o conteggi totali ka - kb
}
int readold=average;;
int error=0;
float angreach=st*sstep*0.0045;
float angolorag=angmin+angreach*2;
RemoteXY.onlineGraph_1_var1=(float)(countka)/(period);
//Serial.print(" ");
RemoteXY.level_3=(int)abs((counttot/period));
// qui inseriamo la registrazione dei dati (angolo, counts) su SD card
myFile.println(" ");
myFile.print(angolorag, 4);
myFile.print(" ");
myFile.print(countka);
myFile.print(" ");
countka=0;
countkb=0;
counttot=0;
digitalWrite(LED4, LOW);
digitalWrite(LED3, HIGH);
digitalWrite(LED5, LOW);
digitalWrite(LED6, HIGH);
delay(200);
}
myFile.close();// si chiude il file dati
/// inserire routine di spegnimento e ritorno a zero
// routine spegnimento raggi e rotazione motore
RXOFF();
LEDROFF();
//digitalWrite(HV, LOW);
digitalWrite(LED2, LOW);
Motoroff();
// routine ritorno a zero tubo
digitalWrite(enaPin,LOW);
digitalWrite(dirPin, LOW);// il motore SX va alla posizione di zero (gira a sinistra)
for(i=0;i< 22000;i++){
digitalWrite(stepPin,LOW);
delayMicroseconds(500);
digitalWrite(stepPin, HIGH);
delayMicroseconds(500);
delay(0.1);
if(digitalRead(SW1SX0)==HIGH){
digitalWrite(LED6, HIGH);
i=22000;
}
}
// routine ritorno a zero tubo
digitalWrite(ena2Pin,LOW);
digitalWrite(dir2Pin, LOW);// // il motore DX va alla posizione di zero (gira a sinistra)
for(i=0;i< 22000;i++){
digitalWrite(step2Pin,LOW);
delayMicroseconds(500);
digitalWrite(step2Pin, HIGH);
delayMicroseconds(500);
delay(0.1);
//Serial.println(i);
isx=i;
if(digitalRead(SW2DX0)==HIGH){
digitalWrite(LED5, HIGH);
i=22000;
}}}