曙光生物研究探空火箭计划(超详细,持续更新)流量警告

自立下flag已经过去了3个多月,整天画图奔波忙到吐。然后。。。然后就忘记发帖了(跪)

香蕉君可能会迟到,但他从不缺席(误)。


项目说明:

1.搭载仓鼠一只。

2.携带心率血氧传感器对其记录在强加速度下生物体征数据的变化。

3.携带气压传感器测量高度海拔与温度。

4.携带三轴加速度计完成开伞和飞行数据测量。

5.携带sd卡模块记录全部数据。

6.搭载宏天云图传及高清运动相机,实时完成火箭航拍并记录影像。

7.搭载miniDV(夜视)监测生物舱装况并记录影像。

传感器及电子元件清单


注:图中一些元件并没有用到(如hx711用作试车台推力计)

arduino尽管性能不佳,但如此小巧简单还是用作航电开发板的首选。。嗯。老板来两片

mpu6050,强大。@彩虹之巅,详见https://www.kechuang.org/t/55025(很多同学反映GitHub上面下载的库文件会带有网页地址,影响程序编译,整理了一下贴过来方便大家使用)

mpu6050.zip81.9k7次下载

max30102,心率血氧模块,非常小巧好用。上资料:

MH-ET LIVE _MAX30102 Ardunio.zip87.3k4次下载

bmp180,非常常见的气压计。上代码:

//Arduino 1.0+ Only
//Arduino 1.0+ Only

/*Based largely on code by  Jim Lindblom

Get pressure, altitude, and temperature from the BMP085.
Serial.print it out at 9600 baud to serial monitor.
*/

#include <Wire.h>

#define BMP085_ADDRESS 0x77  // I2C address of BMP085

const unsigned char OSS = 0;  // Oversampling Setting

// Calibration values
int ac1;
int ac2;
int ac3;
unsigned int ac4;
unsigned int ac5;
unsigned int ac6;
int b1;
int b2;
int mb;
int mc;
int md;

// b5 is calculated in bmp085GetTemperature(...), this variable is also used in bmp085GetPressure(...)
// so ...Temperature(...) must be called before ...Pressure(...).
long b5; 

void setup(){
  Serial.begin(9600);
  Wire.begin();

  bmp085Calibration();
}

void loop()
{
  float temperature = bmp085GetTemperature(bmp085ReadUT()); //MUST be called first
  float pressure = bmp085GetPressure(bmp085ReadUP());
  float atm = pressure / 101325; // "standard atmosphere"
  float altitude = calcAltitude(pressure); //Uncompensated caculation - in Meters 

  Serial.print("Temperature: ");
  Serial.print(temperature, 2); //display 2 decimal places
  Serial.println("deg C");

  Serial.print("Pressure: ");
  Serial.print(pressure, 0); //whole number only.
  Serial.println(" Pa");

  Serial.print("Standard Atmosphere: ");
  Serial.println(atm, 4); //display 4 decimal places

  Serial.print("Altitude: ");
  Serial.print(altitude, 2); //display 2 decimal places
  Serial.println(" M");

  Serial.println();//line break

  delay(1000); //wait a second and get values again.
}

// Stores all of the bmp085's calibration values into global variables
// Calibration values are required to calculate temp and pressure
// This function should be called at the beginning of the program
void bmp085Calibration()
{
  ac1 = bmp085ReadInt(0xAA);
  ac2 = bmp085ReadInt(0xAC);
  ac3 = bmp085ReadInt(0xAE);
  ac4 = bmp085ReadInt(0xB0);
  ac5 = bmp085ReadInt(0xB2);
  ac6 = bmp085ReadInt(0xB4);
  b1 = bmp085ReadInt(0xB6);
  b2 = bmp085ReadInt(0xB8);
  mb = bmp085ReadInt(0xBA);
  mc = bmp085ReadInt(0xBC);
  md = bmp085ReadInt(0xBE);
}

// Calculate temperature in deg C
float bmp085GetTemperature(unsigned int ut){
  long x1, x2;

  x1 = (((long)ut - (long)ac6)*(long)ac5) >> 15;
  x2 = ((long)mc << 11)/(x1 + md);
  b5 = x1 + x2;

  float temp = ((b5 + 8)>>4);
  temp = temp /10;

  return temp;
}

// Calculate pressure given up
// calibration values must be known
// b5 is also required so bmp085GetTemperature(...) must be called first.
// Value returned will be pressure in units of Pa.
long bmp085GetPressure(unsigned long up){
  long x1, x2, x3, b3, b6, p;
  unsigned long b4, b7;

  b6 = b5 - 4000;
  // Calculate B3
  x1 = (b2 * (b6 * b6)>>12)>>11;
  x2 = (ac2 * b6)>>11;
  x3 = x1 + x2;
  b3 = (((((long)ac1)*4 + x3)<<OSS) + 2)>>2;

  // Calculate B4
  x1 = (ac3 * b6)>>13;
  x2 = (b1 * ((b6 * b6)>>12))>>16;
  x3 = ((x1 + x2) + 2)>>2;
  b4 = (ac4 * (unsigned long)(x3 + 32768))>>15;

  b7 = ((unsigned long)(up - b3) * (50000>>OSS));
  if (b7 < 0x80000000)
    p = (b7<<1)/b4;
  else
    p = (b7/b4)<<1;

  x1 = (p>>8) * (p>>8);
  x1 = (x1 * 3038)>>16;
  x2 = (-7357 * p)>>16;
  p += (x1 + x2 + 3791)>>4;

  long temp = p;
  return temp;
}

// Read 1 byte from the BMP085 at 'address'
char bmp085Read(unsigned char address)
{
  unsigned char data;

  Wire.beginTransmission(BMP085_ADDRESS);
  Wire.write(address);
  Wire.endTransmission();

  Wire.requestFrom(BMP085_ADDRESS, 1);
  while(!Wire.available())
    ;

  return Wire.read();
}

// Read 2 bytes from the BMP085
// First byte will be from 'address'
// Second byte will be from 'address'+1
int bmp085ReadInt(unsigned char address)
{
  unsigned char msb, lsb;

  Wire.beginTransmission(BMP085_ADDRESS);
  Wire.write(address);
  Wire.endTransmission();

  Wire.requestFrom(BMP085_ADDRESS, 2);
  while(Wire.available()<2)
    ;
  msb = Wire.read();
  lsb = Wire.read();

  return (int) msb<<8 | lsb;
}

// Read the uncompensated temperature value
unsigned int bmp085ReadUT(){
  unsigned int ut;

  // Write 0x2E into Register 0xF4
  // This requests a temperature reading
  Wire.beginTransmission(BMP085_ADDRESS);
  Wire.write(0xF4);
  Wire.write(0x2E);
  Wire.endTransmission();

  // Wait at least 4.5ms
  delay(5);

  // Read two bytes from registers 0xF6 and 0xF7
  ut = bmp085ReadInt(0xF6);
  return ut;
}

// Read the uncompensated pressure value
unsigned long bmp085ReadUP(){

  unsigned char msb, lsb, xlsb;
  unsigned long up = 0;

  // Write 0x34+(OSS<<6) into register 0xF4
  // Request a pressure reading w/ oversampling setting
  Wire.beginTransmission(BMP085_ADDRESS);
  Wire.write(0xF4);
  Wire.write(0x34 + (OSS<<6));
  Wire.endTransmission();

  // Wait for conversion, delay time dependent on OSS
  delay(2 + (3<<OSS));

  // Read register 0xF6 (MSB), 0xF7 (LSB), and 0xF8 (XLSB)
  msb = bmp085Read(0xF6);
  lsb = bmp085Read(0xF7);
  xlsb = bmp085Read(0xF8);

  up = (((unsigned long) msb << 16) | ((unsigned long) lsb << 8) | (unsigned long) xlsb) >> (8-OSS);

  return up;
}

void writeRegister(int deviceAddress, byte address, byte val) {
  Wire.beginTransmission(deviceAddress); // start transmission to device 
  Wire.write(address);       // send register address
  Wire.write(val);         // send value to write
  Wire.endTransmission();     // end transmission
}

int readRegister(int deviceAddress, byte address){

  int v;
  Wire.beginTransmission(deviceAddress);
  Wire.write(address); // register to read
  Wire.endTransmission();

  Wire.requestFrom(deviceAddress, 1); // read a byte

  while(!Wire.available()) {
    // waiting
  }

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

float calcAltitude(float pressure){

  float A = pressure/101325;
  float B = 1/5.25588;
  float C = pow(A,B);
  C = 1 - C;
  C = C /0.0000225577;

  return C;
}

sd卡模块(注意带电平转换)

继电器模块(可用三极管代替)

gps模块(需要sim800c支持gprs数据传输至onenet云,然后运存又炸了,然后就需要2560,然后。。就没有然后了。最后搞了个tcl的成品gps+北斗跟踪器)

在这里还是讲述一下这个悲伤的故事叭= =

测试123 qwq(因为在室内。。根本搜不到星)

后来在室外也搜不到,,商家的陶瓷天线我认为一点用都没有。。。

故接上了3m长的强大天线= =(收到了信号√)

资料包https://www.kechuang.org/t/83599

因为要远程监控轨迹,所以就用到了物联网数据整合利器onenet平台https://open.iot.10086.cn/

申请项目找到自己设备的key然后把key填写至sim800c或其他gprs模块的代码中去,就可以实时记录项目数据了

代码:

#include <TimerOne.h>

#define DebugSerial Serial
#define GprsSerail Serial3
#define GpsSerial  Serial2

struct
{
  char GPS_Buffer[80];
  bool isGetData;   //是否获取到GPS数据
  bool isParseData; //是否解析完成
  char UTCTime[11];   //UTC时间
  char latitude[11];    //纬度
  char N_S[2];    //N/S
  char longitude[12];   //经度
  char E_W[2];    //E/W
  bool isUsefull;   //定位信息是否有效
} Save_Data;

const unsigned int gpsRxBufferLength = 600;
char gpsRxBuffer[gpsRxBufferLength];
unsigned int gpsRxCount = 0;

#define Success 1U
#define Failure 0U

int L = 13; //LED指示灯引脚

unsigned long  Time_Cont = 0;       //定时器计数器

const unsigned int gprsRxBufferLength = 600;
char gprsRxBuffer[gprsRxBufferLength];
unsigned int gprsBufferCount = 0;
char OneNetServer[] = "api.heclouds.com";       //不需要修改


char device_id[] = "3225187";    //修改为自己的设备ID
char API_KEY[] = "R9xO5NZm6oVI4YBHvCPKEqtwYtMA";    //修改为自己的API_KEY
char sensor_gps[] = "location";

void setup() {
    pinMode(L, OUTPUT);
    digitalWrite(L, LOW);

    Save_Data.isGetData = false;
    Save_Data.isParseData = false;
    Save_Data.isUsefull = false;

    DebugSerial.begin(9600);
    GprsSerail.begin(9600);
    GpsSerial.begin(9600);      //定义波特率9600

    Timer1.initialize(1000);
    Timer1.attachInterrupt(Timer1_handler);

    initGprs();

    DebugSerial.println("\r\nsetup end!");
}

void loop() {
      gpsRead();  //获取GPS数据
      parseGpsBuffer();//解析GPS数据
      printGpsBuffer();//输出解析后的数据  ,包括发送到OneNet服务器  
}

void printGpsBuffer()
{
  if (Save_Data.isParseData)
  {
    Save_Data.isParseData = false;
    
    DebugSerial.print("Save_Data.UTCTime = ");
    DebugSerial.println(Save_Data.UTCTime);

    if(Save_Data.isUsefull)
    {
      Save_Data.isUsefull = false;
      DebugSerial.print("Save_Data.latitude = ");
      DebugSerial.println(Save_Data.latitude);
      DebugSerial.print("Save_Data.N_S = ");
      DebugSerial.println(Save_Data.N_S);
      DebugSerial.print("Save_Data.longitude = ");
      DebugSerial.println(Save_Data.longitude);
      DebugSerial.print("Save_Data.E_W = ");
      DebugSerial.println(Save_Data.E_W);
      
      postGpsDataToOneNet(API_KEY,device_id,sensor_gps,Save_Data.longitude,Save_Data.latitude); 
    }
    else
    {
      DebugSerial.println("GPS DATA is not usefull!");
    }
    
  }
}

void parseGpsBuffer()
{
  char *subString;
  char *subStringNext;
  if (Save_Data.isGetData)
  {
    Save_Data.isGetData = false;
    DebugSerial.println("**************");
    DebugSerial.println(Save_Data.GPS_Buffer);

    
    for (int i = 0 ; i <= 6 ; i++)
    {
      if (i == 0)
      {
        if ((subString = strstr(Save_Data.GPS_Buffer, ",")) == NULL)
          errorLog(12);  //解析错误
      }
      else
      {
        subString++;
        if ((subStringNext = strstr(subString, ",")) != NULL)
        {
          char usefullBuffer[2]; 
          switch(i)
          {
            case 1:memcpy(Save_Data.UTCTime, subString, subStringNext - subString);break; //获取UTC时间
            case 2:memcpy(usefullBuffer, subString, subStringNext - subString);break; //获取UTC时间
            case 3:memcpy(Save_Data.latitude, subString, subStringNext - subString);break;  //获取纬度信息
            case 4:memcpy(Save_Data.N_S, subString, subStringNext - subString);break; //获取N/S
            case 5:memcpy(Save_Data.longitude, subString, subStringNext - subString);break; //获取纬度信息
            case 6:memcpy(Save_Data.E_W, subString, subStringNext - subString);break; //获取E/W

            default:break;
          }

          subString = subStringNext;
          Save_Data.isParseData = true;
          if(usefullBuffer[0] == 'A')
            Save_Data.isUsefull = true;
          else if(usefullBuffer[0] == 'V')
            Save_Data.isUsefull = false;

        }
        else
        {
          errorLog(13);  //解析错误
        }
      }


    }
  }
}


void gpsRead() {
  while (GpsSerial.available())
  {
    gpsRxBuffer[gpsRxCount++] = GpsSerial.read();
    if (gpsRxCount == gpsRxBufferLength)clrGpsRxBuffer();
  }

  char* GPS_BufferHead;
  char* GPS_BufferTail;
  if ((GPS_BufferHead = strstr(gpsRxBuffer, "$GPRMC,")) != NULL || (GPS_BufferHead = strstr(gpsRxBuffer, "$GNRMC,")) != NULL )
  {
    if (((GPS_BufferTail = strstr(GPS_BufferHead, "\r\n")) != NULL) && (GPS_BufferTail > GPS_BufferHead))
    {
      memcpy(Save_Data.GPS_Buffer, GPS_BufferHead, GPS_BufferTail - GPS_BufferHead);
      Save_Data.isGetData = true;

      clrGpsRxBuffer();
    }
  }
}

void clrGpsRxBuffer(void)
{
  memset(gpsRxBuffer, 0, gpsRxBufferLength);      //清空
  gpsRxCount = 0;
}

double longitudeToOnenetFormat(char *lon_str_temp)
{
  double lon_temp = 0;
  long lon_Onenet = 0;
  int dd_int = 0;
  long mm_int = 0;
  double lon_Onenet_double = 0;

  lon_temp = atof(lon_str_temp);
  lon_Onenet =lon_temp*100000;  //转换为整数

  dd_int = lon_Onenet/10000000; //取出dd

  mm_int = lon_Onenet%10000000;  //取出MM部分


  lon_Onenet_double = dd_int + (double)mm_int/60/100000;//换算为Onenet格式


  return lon_Onenet_double;
}

double latitudeToOnenetFormat(char *lat_str_temp)
{
  double lat_temp = 0;
  long lat_Onenet = 0;
  int dd_int = 0;
  long mm_int = 0;

  double lat_Onenet_double = 0;

  lat_temp = atof(lat_str_temp);
  lat_Onenet =lat_temp*100000;  //转换为整数

  dd_int = lat_Onenet/10000000; //取出dd

  mm_int = lat_Onenet%10000000;  //取出MM部分

  lat_Onenet_double = dd_int + (double)mm_int/60/100000;//换算为Onenet格式


  return lat_Onenet_double;
}

void postGpsDataToOneNet(char* API_VALUE_temp,char* device_id_temp,char* sensor_id_temp,char* lon_temp,char* lat_temp)
{
    char send_buf[400]= {0};
    char text[100] = {0};
    char tmp[25] = {0};

    char lon_str_end[15] = {0};
    char lat_str_end[15] = {0};

    dtostrf(longitudeToOnenetFormat(lon_temp),3,6, lon_str_end);  //转换成字符串输出
    dtostrf(latitudeToOnenetFormat(lat_temp),2,6, lat_str_end);  //转换成字符串输出

    //连接服务器
    memset(send_buf, 0, 400);    //清空
    strcpy(send_buf, "AT+CIPSTART=\"TCP\",\"");
    strcat(send_buf, OneNetServer);
    strcat(send_buf, "\",80\r\n");
    if (sendCommand(send_buf, "CONNECT", 10000, 5) == Success);
    else errorLog(7);

    //发送数据
    if (sendCommand("AT+CIPSEND\r\n", ">", 3000, 1) == Success);
    else errorLog(8);

    memset(send_buf, 0, 400);    //清空

    /*准备JSON串*/
    //ARDUINO平台不支持sprintf的double的打印,只能转换到字符串然后打印
    sprintf(text,"{\"datastreams\":[{\"id\":\"%s\",\"datapoints\":[{\"value\":{\"lon\":%s,\"lat\":%s}}]}]}"
      ,sensor_id_temp,lon_str_end,lat_str_end);
  
    /*准备HTTP报头*/
    send_buf[0] = 0;
    strcat(send_buf,"POST /devices/");
    strcat(send_buf,device_id_temp);
    strcat(send_buf,"/datapoints HTTP/1.1\r\n");//注意后面必须加上\r\n
    strcat(send_buf,"api-key:");
    strcat(send_buf,API_VALUE_temp);
    strcat(send_buf,"\r\n");
    strcat(send_buf,"Host:");
    strcat(send_buf,OneNetServer);
    strcat(send_buf,"\r\n");
    sprintf(tmp,"Content-Length:%d\r\n\r\n", strlen(text));//计算JSON串长度
    strcat(send_buf,tmp);
    strcat(send_buf,text);

    if (sendCommand(send_buf, send_buf, 3000, 1) == Success);
    else errorLog(9);

    char sendCom[2] = {0x1A};
    if (sendCommand(sendCom, "\"succ\"}", 3000, 1) == Success);
    else errorLog(10);

    if (sendCommand("AT+CIPCLOSE\r\n", "CLOSE OK", 3000, 1) == Success);
    else errorLog(11);

    if (sendCommand("AT+CIPSHUT\r\n", "SHUT OK", 3000, 1) == Success);
    else errorLog(11);
}

void initGprs()
{
    if (sendCommand("AT\r\n", "OK", 3000, 10) == Success);
    else errorLog(1);

//      如果输入 AT+CREG? <CR>则返回+CREG: <mode>, <stat> [ ,<lac>,<ci> ]  
// 注: <mode>的值共有三个选项,分别是 0 or 1 or 2,  其中0 代表关闭网络注册结果
//            码, 1 代表当网络注册状态改变时激活网络注册结果码, 2 代表激活网
// 络注册结果码同时显示区域和小区信息.
//    <stat>的返回值共有三个,分别是 0, 1, 2,3,4,5 ,  其中 0 代表没有注册网络同时
//   模块没有找到运营商, 1代注册到了本地网络, 2 代表找到运营商但没
// 有注册网络, 3 代表注册被拒绝, 4 代表未知的数据, 5代表注册在漫游
// 状态.
//    <lac>表示所属网络区域代码,十六进制格式显示,如: “ 279C” 
//    <ci>表示所属网络的小区 ID,十六进制格式显示,如: “ 0EB2”  Tech-Link T&E 
    if (sendCommand("AT+CREG?\r\n", "+CREG: 0,1", 3000, 10) == Success);
    else errorLog(2);

    if (sendCommand("AT+CGCLASS=\"B\"\r\n", "OK", 3000, 2) == Success);
    else errorLog(3);

    if (sendCommand("AT+CGDCONT=1,\"IP\",\"CMNET\"\r\n", "OK", 3000, 2) == Success);
    else errorLog(4);

    if (sendCommand("AT+CGATT=1\r\n", "OK", 3000, 2) == Success);
    else errorLog(5);

    if (sendCommand("AT+CLPORT=\"TCP\",\"2000\"\r\n", "OK", 3000, 2) == Success);
    else errorLog(6); 
}

void(* resetFunc) (void) = 0; //制造重启命令 

void errorLog(int num)  
{
    DebugSerial.print("ERROR");
    DebugSerial.println(num);
    while (1)
    {
        digitalWrite(L, HIGH);
        delay(300);
        digitalWrite(L, LOW);
        delay(300);

        if (sendCommand("AT\r\n", "OK", 100, 10) == Success)
        {
            DebugSerial.print("\r\nRESET!!!!!!\r\n");
            resetFunc();
        }
    }
}



unsigned int sendCommand(char *Command, char *Response, unsigned long Timeout, unsigned char Retry)
{
    clrGprsRxBuffer();
    for (unsigned char n = 0; n < Retry; n++)
    {
        DebugSerial.print("\r\n---------send AT Command:---------\r\n");
        DebugSerial.write(Command);

        GprsSerail.write(Command);

        Time_Cont = 0;
        while (Time_Cont < Timeout)
        {
            gprsReadBuffer();
            if(strstr(gprsRxBuffer, Response) != NULL)
            {
                DebugSerial.print("\r\n==========receive AT Command:==========\r\n");
                DebugSerial.print(gprsRxBuffer); //输出接收到的信息
                clrGprsRxBuffer();
                return Success;
            }
        }
        Time_Cont = 0;
    }
    DebugSerial.print("\r\n==========receive AT Command:==========\r\n");
    DebugSerial.print(gprsRxBuffer);//输出接收到的信息
    clrGprsRxBuffer();
    return Failure;
}




void Timer1_handler(void)
{
    Time_Cont++;
}



void gprsReadBuffer() {
    while (GprsSerail.available())
    {
        gprsRxBuffer[gprsBufferCount++] = GprsSerail.read();
        if (gprsBufferCount == gprsRxBufferLength)clrGprsRxBuffer();
    }
}

void clrGprsRxBuffer(void)
{
    memset(gprsRxBuffer, 0, gprsRxBufferLength);      //清空
    gprsBufferCount = 0;
}

当然喽。2560!328p相继去世

小朋友就应该有小朋友的亚子(误)

宏天云图传(来自邪恶疯狂推销员 绝对零度 )

2w图传配备1280p高清小蚁运动相机

调试(用的雪花屏减少信号干扰)

玛德线断了

自奸商零度了解小蚁相机的信号传输方式不同,连接线比普通micro usb多一根(普通为黑白绿红,坑爹线为黑白黄绿红)

那么。。注入灵魂

小部件比如开关什么的就不列举了

接线图及电子元件测绘


现在来整合一下max30102和bmp180的程序

开局失利= = 刚一上来内存就爆了qaq

我日你仙人板板

官方明示不得使用mega328p

无奈去掉了血氧浓度测试这个功能(有兴趣的盆友可以用2560畅玩)

阉割成太监:

搞了一下午终于小有成就

嗯。看起来好像没什。。。。

我@#¥%%#@¥%……(此处应该有脏话)

崩溃

I2c通信失败

在哥们的帮助下排错= =(转眼就忙到了凌晨)

天。。粗心漏了一段代码

终于,功夫不负有心人

源汁源味

max30102_bmp180(1)(1).rar

实在是没有精力搞sd卡数据写入了(大家闲着可以搞一搞),然后在小箱子里翻到了这个神器(某宝搜索串口数据储存器)

只要接电源和数据线路(txd反接rxd这样)就可以完成数据写入了(最大支持32GbU盘或tf卡)

资料如下

LCES 串口SD卡模块资料.zip5.39M2次下载

布线做航电

此乃精工雕琢,集天地之精华之纸模(雾)

糙汉子一枚略略略粗糙orz

根据纸模的大致结构就可以进行3d建模了

肝肝肝。肝就对了

day one 

day two

day three

day four

day five

!!!!

看了看时间,已是凌晨3点

一阵反胃。赶忙跑到厕所,那一天真的画吐了

洗了个澡回到电脑前,揉揉眼睛看着努力的成果,开心得笑了,可能这就是diy的乐趣吧

/****************************************************************************************/

我是航天员刘培强

当老爷供着

七夕了,送根黄瓜

小崽子在我给它量体征的时候咬了我一口跑路了,害的我在床下逮了半个小时

感谢@零度 提供的3d打印服务w

补更完毕

待续,感谢关注


来自 喷气推进
 
7
2019-8-11 00:39:31
1楼

LZ考虑打板不,打板可以减少不少体积,提高电路可靠性

测试电路一般是一大堆传感器和线的...我会随便用黑胶布包一下就完了...不会像LZ一样用SW系统建模(膜)


不过看起来是大工程啊,加油~

评论(1)折叠评论
加载评论中,请稍候...
折叠评论
2楼

支持!生物探空火箭

折叠评论
加载评论中,请稍候...
折叠评论
暮光之羽(作者)
3楼
引用 ERIC20041219 发表于 2 楼的内容:
支持!生物探空火箭

感谢资磁!

折叠评论
加载评论中,请稍候...
折叠评论
4楼

滋磁,建议楼主使用场管模块代替继电器,增加可靠性。

折叠评论
加载评论中,请稍候...
折叠评论
5楼

原来这仓鼠是干这事用的

折叠评论
加载评论中,请稍候...
折叠评论
2019-8-12 09:14:07
6楼
引用 暮光之羽 发表于 3 楼的内容:
感谢资磁!

328不够用可以用mega644,那个运存大些,价格差不多,板子大小也差不多


感觉还是打样一下比较好,杜邦线的质量的确不咋地,我还有一个10x15cm的免费打样机会没用掉,可以帮你打下,支持一下学长啊

[修改于 2 个月前 - 2019-08-12 09:20:36]

折叠评论
加载评论中,请稍候...
折叠评论
7楼

支持支持!估计射高能有多少

别让小老鼠掉下来时候挂了啊,还是想看到心率血压数据

折叠评论
加载评论中,请稍候...
折叠评论
8楼

可以先空载发射测一下加速度

别仓鼠当场去世了(手动滑稽)

折叠评论
加载评论中,请稍候...
折叠评论
暮光之羽(作者)
9楼
引用 xljxlj 发表于 6 楼的内容:
328不够用可以用mega644,那个运存大些,价格差不多,板子大小也差不多感觉还是打样一下比较好,.....

哇,找了半天这种东西了,多谢提示


折叠评论
加载评论中,请稍候...
折叠评论
暮光之羽(作者)
10楼
引用 ENG ETO 发表于 8 楼的内容:
可以先空载发射测一下加速度别仓鼠当场去世了(手动滑稽)

非常人道的测试:把仓鼠绑自行车后轮上,然后码表定速骑

折叠评论
加载评论中,请稍候...
折叠评论
暮光之羽(作者)
11楼
引用 ENG ETO 发表于 8 楼的内容:
可以先空载发射测一下加速度别仓鼠当场去世了(手动滑稽)

这种加速度的话人是肯定承受不了的,大概20几个g,小动物在短时间内应该没什么大问题

折叠评论
加载评论中,请稍候...
折叠评论
2019-8-13 15:59:49
12楼
引用 暮光之羽 发表于 11 楼的内容:
这种加速度的话人是肯定承受不了的,大概20几个g,小动物在短时间内应该没什么大问题

为何不先做个简易离心机测试一下呢?

ps:1、关于抗过载能力:有记录的人类存活的最大过载约为46.2g(没错,就是那个火箭雪橇的驾驶员);其他哺乳动物未知,小强能扛1000g以上。

2、动物在不同方向上对加速度的承受能力有极大差异。以人类为例,对前后方向上的过载承受能力远高于竖直方向。这是血液流向决定的。

[修改于 2 个月前 - 2019-08-14 08:53:20]

折叠评论
加载评论中,请稍候...
折叠评论
13楼

离心机测试+1。

话说只有我的关注点在萌萌哒小仓鼠吗?为啥要送它上天(而不是其他动物)?

折叠评论
加载评论中,请稍候...
折叠评论
14楼
引用 154454496 发表于 13 楼的内容:
离心机测试+1。话说只有我的关注点在萌萌哒小仓鼠吗?为啥要送它上天(而不是其他动物)?

感觉没有别的合适的了……

小强之类的生命体征不好测啊……


折叠评论
加载评论中,请稍候...
折叠评论
2019-8-14 02:36:03
暮光之羽(作者)
15楼

小崽子又咬我,明天做离心机训练


折叠评论
加载评论中,请稍候...
折叠评论
16楼

建议加个座椅,把小白鼠牢牢地绑在上面,以免乱动弄掉测心跳的电极或者在发射中左右摇摆。

折叠评论
加载评论中,请稍候...
折叠评论
2019-8-15 01:28:26
暮光之羽(作者)
17楼
引用 Squid 发表于 16 楼的内容:
建议加个座椅,把小白鼠牢牢地绑在上面,以免乱动弄掉测心跳的电极或者在发射中左右摇摆。

蛤蛤蛤(手动滑稽)

折叠评论
加载评论中,请稍候...
折叠评论
2019-8-16 13:33:04
2019-8-16 13:33:04
18楼

建议去打个PCB吧,无论是体积还是电气部分的稳定性都要好很多。某宝随便找就可以,也不贵。

折叠评论
加载评论中,请稍候...
折叠评论
2019-8-22 21:51:59
2019-8-22 21:51:59
暮光之羽(作者)
19楼

小鼠的生活日常


臂力惊人身强体壮,经过一番训练已经丝毫不会畏惧很大的噪音了(⊙x⊙;)

(在它小屋外经常使用角磨机。。)

注:3d打印那边出了点问题,应该是软件问题,目前已经调整好了,还剩下小鼠的宇航服没做好,然后就是这几天撸主外出参加比赛大概4天时间

嘤嘤嘤,请观众老爷们耐心等待。

零件加工好后由@零度 负责更新制作组图

呜呜呜

太艹了,各种失误


[修改于 1 个月前 - 2019-08-30 18:00:52]

折叠评论
加载评论中,请稍候...
折叠评论
2019-8-23 16:15:26
20楼

好,牛逼。鼓励。

折叠评论
1
加载评论中,请稍候...
折叠评论
21楼

鼠鼠吓尿会不会造成航电报废2333

+0.5  科创币    虎哥   2019-08-23   噗,这是一个很重要的问题
+0.5  科创币    ERIC20041219   2019-08-24   亏你想的出来
折叠评论
6
加载评论中,请稍候...
折叠评论
2019-8-24 17:15:54
22楼

楼上说得对,“乘员舱”应妥善密封、加压、控温,还应提前对“乘员”进行训练,使其适应“乘员舱”以及发射时的噪声、振动。毕竟实验目的是“对其记录在强加速度下生物体征数据的变化”,应尽量减少其他因素造成的影响。

折叠评论
加载评论中,请稍候...
折叠评论
暮光之羽(作者)
23楼
引用 radio 发表于 21 楼的内容:
鼠鼠吓尿会不会造成航电报废2333

所以专门为小鼠制作了一套航天服,具有抗荷防水的功能,连接件见正文最下方3图,分别是头盔、腰带、手套环这个问题早就考虑到了233

折叠评论
3
加载评论中,请稍候...
折叠评论
2019-8-25 11:26:47
24楼
引用 Robot_V1 发表于 12 楼的内容:
为何不先做个简易离心机测试一下呢?ps:1、关于抗过载能力:有记录的人类存活的最大过载约为46.2g.....

没错,头脚方向大部分人6G就挂彩了当然也不乏少数且经过训练的那些扛12G30+s以上

倒是胸背方向能扛20+G,参考联盟那次事故

折叠评论
加载评论中,请稍候...
折叠评论
2019-8-30 17:23:46
2019-8-30 17:23:46
暮光之羽(作者)
25楼

失踪人口回归前来更新(汗)

3D打印航电 @零度(此楼更新中)

这里出了点小插曲。。。除了打印软件抽风外,散热风扇也坏掉了

经过一番调整之后恢复了正常

装零件

可能由于调试原因,一个部件打坏了。还有几个部件需要做出调整

塞不进去(无助= =)

还有就是。。这哥们好像变胖了= =

只能再做一套航天服了

航电舱与发动机段连接件(因为没有57的酚醛棒料了,只能打印一个喽)

(未完)

折叠评论
加载评论中,请稍候...
折叠评论
暮光之羽(作者)
26楼

火箭发动机(此楼更新中)

感谢@御坂18650 毛妹贡献的57航箭

经毛妹测试,使用KNSB燃料可获得800N的推力

57外径航箭测绘

当时还没用熟soildworks。。emm就用AutoCAD先跑一跑

航箭气动自旋1200r/min,这还怎么航拍。。(对方并不想理你并向你丢了一只高能自爆螺旋拐弯狗.jpg)

所以用铝板把气动槽填♂满了嘤

用剪板器ctrl+c

金属粘黏剂ctrl+v

粘贴完毕之后敲敲打打,胶水填缝

最后用角磨机磨平alt+f4(误)

燃料隔热层

因为小动物比较脆弱,所以在此选择比较温和的燃料,也是非常普遍的业余固体燃料-KNSB

隔热层使用pvc排水管道

切割切割。。

鸭累!欧拉欧拉欧拉欧拉!(突然中二)

车削外壁

值得注意的是,PVC管道十分脆弱,因此在使用卡盘时要在内壁垫一个坚固的实体

就是你啦(掏出)

雪花飘飘,北风萧萧(雾)

(未完)

折叠评论
加载评论中,请稍候...
折叠评论
2019-8-31 21:48:55
2019-8-31 21:48:55
27楼

加油

折叠评论
加载评论中,请稍候...
折叠评论
2019-9-24 23:53:05
2019-9-24 23:53:05
28楼

坐等,加油。

折叠评论
加载评论中,请稍候...
折叠评论
2019-9-25 10:26:15
29楼

加油

折叠评论
加载评论中,请稍候...
折叠评论
30楼

问一下,是Autocad好用还是soildworks好用?我一同学学Autocad学了一星期,跟没学差不多。。。

折叠评论
加载评论中,请稍候...
折叠评论
31楼
引用 精致大眼剑水蚤 发表于 29 楼的内容:
问一下,是Autocad好用还是soildworks好用?我一同学学Autocad学了一星期,跟没学.....

3维图solidworks好用,平面图随意

折叠评论
加载评论中,请稍候...
折叠评论
2019-9-26 12:31:46
32楼
引用 sd196821 发表于 31 楼的内容:
3维图solidworks好用,平面图随意

谢谢告知!!

折叠评论
加载评论中,请稍候...
折叠评论
2019-9-27 19:29:14
2019-9-27 19:29:14
暮光之羽(作者)
33楼
引用 精致大眼剑水蚤 发表于 32 楼的内容:
谢谢告知!!

平面还是AutoCAD强大

折叠评论
加载评论中,请稍候...
折叠评论
暮光之羽(作者)
34楼

统一回复,开学之后事多的一批

不过楼主仍在艰难爬行中,感谢大家关注w

折叠评论
加载评论中,请稍候...
折叠评论
35楼
引用 暮光之羽 发表于 34 楼的内容:
统一回复,开学之后事多的一批不过楼主仍在艰难爬行中,感谢大家关注w

加油,深有同感

折叠评论
加载评论中,请稍候...
折叠评论
36楼
引用 暮光之羽 发表于 23 楼的内容:
所以专门为小鼠制作了一套航天服,具有抗荷防水的功能,连接件见正文最下方3图,分别是头盔、腰带、手套环.....

祝升空顺利,然后那到一手数据,(其实最想看仓鼠下来是不是已经不醒鼠事了

折叠评论
加载评论中,请稍候...
折叠评论
2019-9-28 01:30:50
37楼

仓鼠会不会又胖了

评论(1)折叠评论
加载评论中,请稍候...
折叠评论
2019-9-29 12:29:07
2019-9-29 12:29:07
38楼

楼主加油,期待结果

折叠评论
加载评论中,请稍候...
折叠评论
39楼

卧槽,玩得这么大,要不要先拿昆虫来做试验啊,感觉用仓鼠还有有点担心安全性

折叠评论
加载评论中,请稍候...
折叠评论

想参与大家的讨论?现在就 登录 或者 注册

插入资源
全部
图片
视频
音频
附件
全部
未使用
已使用
正在上传
空空如也~
上传中..{{f.progress}}%
处理中..
上传失败,点击重试
{{f.name}}
空空如也~
(视频){{r.oname}}
{{selectedResourcesId.indexOf(r.rid) + 1}}
ID:{{user.uid}}
{{user.username}}
{{user.info.certsName}}
{{user.description}}
{{format("YYYY/MM/DD", user.toc)}}注册,{{fromNow(user.tlv)}}活动
{{submitted?"":"投诉"}}
请选择违规类型:
{{reason.description}}
支持的图片格式:jpg, jpeg, png