/* Function Generator and Frequency Counter with SCPI parser setup: 1. programm your Arduino 2. addapt the serial port in your python script to the serial port used on your PC 3. run the python script PC: python with tkinter and pyserial MC: any Arduino YY.MM.DD 22.05.06 first version of function generator by mchris 22.05.08 V0.2, SCPI parser lib included by mchris 22.05.14 V0.2, frequency counter added by mchris Use SCPI library from https://github.com/Vrekrer/Vrekrer_scpi_parser */ #include "Arduino.h" #include "Vrekrer_scpi_parser.h" SCPI_Parser my_instrument; #define COUNTERINPUT_PIN 6 #define FREQENCY_PIN 8 void setup() { //We change the `hash_magic_number` variable before registering the commands my_instrument.hash_magic_number = 16; //16 will generate hash crashes //The default value is 37 and good values are prime numbers (up to 113) my_instrument.RegisterCommand(F("*IDN?"), &Identify); //*IDN? my_instrument.SetCommandTreeBase(F("GENErator:")); my_instrument.RegisterCommand(F(":FREQency"), &SetGeneratorFrequency); //GENE:FREQ 100 my_instrument.RegisterCommand(F(":FREQency?"), &GetGeneratorFrequency); //GENE:FREQ? my_instrument.SetCommandTreeBase(F("COUNter:")); my_instrument.RegisterCommand(F(":FREQency?"), &GetCounterFrequency); //GENE:FREQ? Serial.begin(115200); while (!Serial) {;} //my_instrument.PrintDebugInfo(); } void loop() { my_instrument.ProcessInput(Serial, "\n"); } void Identify(SCPI_C commands, SCPI_P parameters, Stream& interface) { interface.println(F("MCHRIS, Arduino Frequency Counter and Generator V0.3")); } uint32_t Frequency=0; void SetGeneratorFrequency(SCPI_C commands, SCPI_P parameters, Stream& interface) { String str=parameters[0]; Frequency=str.toInt(); Serial.print("f set: "); Serial.println(Frequency); tone(FREQENCY_PIN,Frequency); } void GetGeneratorFrequency(SCPI_C commands, SCPI_P parameters, Stream& interface) { Serial.print("f read: "); Serial.println(Frequency); } #define MEASUREMENT_TIME_US 1000000L uint32_t Counter=0; void GetCounterFrequency(SCPI_C commands, SCPI_P parameters, Stream& interface) { float frequency; uint32_t startTime=micros(); bool state=0; frequency=Counter; // measure next frequency Counter=0; while((micros()-startTime)